2014-11-05 95 views
1

我有下面的查詢,平均需要超過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. 

你能幫好這個查詢?請讓我知道是否需要關於表的其他任何事情。統計信息也不會收集在這張表上。

+0

*「我的條件是我無法爲此查詢添加任何索引」 - 爲什麼?這是索引的目的。另外,使用這些舊式連接而不是「內部連接」的任何特殊原因? – GolezTrol 2014-11-05 22:36:01

+0

你加入的桌子有多大?你有沒有試過HASH提示來防止嵌套循環?最後一次表格被分析的時間是什麼時候? – 2014-11-05 23:09:24

+0

我認爲這些表具有應該存在的所有索引,並且由於這些表在整個應用程序中用於多路處理,所以任何添加索引的建議都不受歡迎。你指的是哪種HASH提示? USE_HASH?如果其中一個表的記錄較少,那麼該提示會更好。這裏所有的表格都有成千上萬的記錄。我將不得不檢查什麼時候是最後一次使用DBA進行分析的時間表。將獲得該信息。 – 2014-11-05 23:30:26

回答

1

您的查詢計劃顯示HINT = RULE。這是爲什麼?這是你的dbms中的標準設置嗎?爲什麼不使用優化器?你可以使用 /*+CHOOSE*/。這可能是所有需要的。 (爲什麼在桌子上沒有Stats?)

編輯:上面是無稽之談。通過不收集任何統計信息,可以防止優化器執行其工作。它總是會回落到舊的規則,因爲它沒有計算成本的基礎,並找到一個更好的計劃。看到你自願讓dbms避免快速查詢,這很奇怪。當然,您可以在查詢中使用提示,但在表格數據發生顯着變化時,請務必小心檢查並更改它們。更好地收集統計數據並讓優化器完成這項工作。至於有用的提示:

我的感覺說:有了CM_CONTRACT_DETAIL許多標準,這應該是駕駛臺。你可以用/*+LEADING(a)*/強制執行。甚至可以在表格/*+FULL(a)*/上使用全表掃描,您仍然可以通過並行執行加速:/*+PARALLEL(a,4)*/

祝您好運:-)

+0

由於我在所有計劃中都看到了,所以我認爲它是一個標準設置?有沒有我可以運行的任何命令來檢查是否是這種情況? – 2014-11-05 23:08:09

+0

我嘗試了所有提示,並且我看到FULL SCAN實際上增加了查詢的成本。通過LEADING提示,解釋計劃沒有變化。我的意思是保持不變。關於CM_CONTRACT_DETAIL TABLE上的dealer_bp_id列,我能做些什麼嗎?我有一種感覺,這是造成查詢的成本。查詢結構是否足夠明智? – 2014-11-05 23:17:55

+0

對不起,我很困惑。我從來沒有見過dbms選擇了RULE計劃。通過不收集任何統計信息,可以防止優化器執行其工作。它不知道,如果某些標準將獲得表數據的1%或99%。所以它回落到使用舊規則。無論你看到什麼成本,都不要相信它!優化器(幾乎)沒有計算成本的基礎。因此,請嘗試使用FULL提示進行查詢,然後測量時間。 – 2014-11-06 06:50:00

相關問題