我有下面的查詢,平均需要超過5秒才能獲取通過應用程序觸發的事務中的數據。我正在尋找一種提示,可以幫助我減少每次被查詢時查詢該查詢所花費的時間。我的條件是我無法添加任何索引或更改此查詢的任何應用程序設置。因此,oracle提示或改變查詢的結構是我唯一的選擇。請在我的查詢下面找到。提示SQL查詢連接有百萬條記錄的表
SELECT SUM(c.cash_flow_amount) FROM CM_CONTRACT_DETAIL a ,CM_CONTRACT b,CM_CONTRACT_CASHFLOW c
WHERE a.country_code = Ip_country_code
AND a.company_code = ip_company_code
AND a.dealer_bp_id = ip_bp_id
AND a.contract_start_date >= ip_start_date
AND a.contract_start_date <= ip_end_date
AND a.version_number = b.current_version
AND a.status_code IN ('00','10')
AND a.country_code = b.country_code
AND a.company_code = b.company_code
AND a.contract_number = b.contract_number
AND a.country_code = c.country_code
AND a.company_code = c.company_code
AND a.contract_number = c.contract_number
AND a.version_number = c.version_number
AND c.cash_flow_type_code IN ('07','13');
要知道關於表的事情是他們都是事務性表,並且此表的數據每天都在變化。他們的記錄數量在1個到10個。 這是對查詢的解釋計劃目前:
操作對象行名稱字節成本對象節點輸入/輸出爲PStart PSTOP
SELECT STATEMENT Hint=RULE
SORT AGGREGATE
TABLE ACCESS BY INDEX ROWID CM_CONTRACT_CASHFLOW
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID CM_CONTRACT_DETAIL
INDEX RANGE SCAN XIF760CT_CONTRACT_DETAIL
TABLE ACCESS BY INDEX ROWID CM_CONTRACT
INDEX UNIQUE SCAN XPKCM_CONTRACT
INDEX RANGE SCAN XPKCM_CONTRACT_CASHFLOW
Indexes on CM_CONTRACT_DETAIL:
XPKCM_CONTRACT_DETAIL is a composite unique index on country_code, company_code, contract_number and version_number
XIF760CT_CONTRACT_DETAIL is a non unique index on dealer_bp_id
Indexes on CM_CONTRACT:
XPKCM_CONTRACT is a composite unique index on country_code, company_code, contract_number
Indexes on CM_CONTRACT_CASHFLOW:
XPKCM_CONTRACT_CASHFLOW is a composite unique index on country_code, company_code, contract_number and version_number,supply_sequence_number, cash_flow_type_code,payment_date.
你能幫好這個查詢?請讓我知道是否需要關於表的其他任何事情。統計信息也不會收集在這張表上。
*「我的條件是我無法爲此查詢添加任何索引」 - 爲什麼?這是索引的目的。另外,使用這些舊式連接而不是「內部連接」的任何特殊原因? – GolezTrol 2014-11-05 22:36:01
你加入的桌子有多大?你有沒有試過HASH提示來防止嵌套循環?最後一次表格被分析的時間是什麼時候? – 2014-11-05 23:09:24
我認爲這些表具有應該存在的所有索引,並且由於這些表在整個應用程序中用於多路處理,所以任何添加索引的建議都不受歡迎。你指的是哪種HASH提示? USE_HASH?如果其中一個表的記錄較少,那麼該提示會更好。這裏所有的表格都有成千上萬的記錄。我將不得不檢查什麼時候是最後一次使用DBA進行分析的時間表。將獲得該信息。 – 2014-11-05 23:30:26