我試圖運行Oracle 8i的服務器上的以下PL/SQL(老,我知道):的Oracle 8i的日期功能緩慢
select
-- stuff --
from
s_doc_quote d,
s_quote_item i,
s_contact c,
s_addr_per a,
cx_meter_info m
where
d.row_id = i.sd_id
and d.con_per_id = c.row_id
and i.ship_per_addr_id = a.row_id(+)
and i.x_meter_info_id = m.row_id(+)
and d.x_move_type in ('Move In','Move Out','Move Out/Move In')
and i.prod_id in ('1-QH6','1-QH8')
and d.created between add_months(trunc(sysdate,'MM'), -1) and sysdate
;
執行是非常緩慢的但是。由於服務器每晚在午夜時分停機,因此通常無法及時完成。
執行計劃如下:
SELECT STATEMENT 1179377
NESTED LOOPS 1179377
NESTED LOOPS OUTER 959695
NESTED LOOPS OUTER 740014
NESTED LOOPS 520332
INLIST ITERATOR
TABLE ACCESS BY INDEX ROWID S_QUOTE_ITEM 157132
INDEX RANGE SCAN S_QUOTE_ITEM_IDX8 8917
TABLE ACCESS BY INDEX ROWID S_DOC_QUOTE 1
INDEX UNIQUE SCAN S_DOC_QUOTE_P1 1
TABLE ACCESS BY INDEX ROWID S_ADDR_PER 1
INDEX UNIQUE SCAN S_ADDR_PER_P1 1
TABLE ACCESS BY INDEX ROWID CX_METER_INFO 1
INDEX UNIQUE SCAN CX_METER_INFO_P1 1
TABLE ACCESS BY INDEX ROWID S_CONTACT 1
INDEX UNIQUE SCAN S_CONTACT_P1 1
如果我改變下列其中然而子句:
and d.created between add_months(trunc(sysdate,'MM'), -1) and sysdate
要的靜態值,諸如:
and d.created between to_date('20110101','yyyymmdd') and sysdate
的執行計劃變爲:
SELECT STATEMENT 5
NESTED LOOPS 5
NESTED LOOPS OUTER 4
NESTED LOOPS OUTER 3
NESTED LOOPS 2
TABLE ACCESS BY INDEX ROWID S_DOC_QUOTE 1
INDEX RANGE SCAN S_DOC_QUOTE_IDX1 3
INLIST ITERATOR
TABLE ACCESS BY INDEX ROWID S_QUOTE_ITEM 1
INDEX RANGE SCAN S_QUOTE_ITEM_IDX4 4
TABLE ACCESS BY INDEX ROWID S_ADDR_PER 1
INDEX UNIQUE SCAN S_ADDR_PER_P1 1
TABLE ACCESS BY INDEX ROWID CX_METER_INFO 1
INDEX UNIQUE SCAN CX_METER_INFO_P1 1
TABLE ACCESS BY INDEX ROWID S_CONTACT 1
INDEX UNIQUE SCAN S_CONTACT_P1 1
它幾乎立即開始返回行。
到目前爲止,我已經嘗試用綁定變量替換動態日期條件,以及使用從雙表中選擇動態日期的子查詢。迄今爲止,這些方法都沒有幫助提高性能。
因爲我對PL/SQL相對來說比較陌生,所以我無法理解執行計劃中這些實質性差異的原因。
我也試圖從SAS傳遞查詢作爲傳遞,但爲了測試執行速度的目的,我一直在使用SQL * Plus。
編輯:
爲了澄清,我已經使用綁定變量如下已經嘗試過:
var start_date varchar2(8);
exec :start_date := to_char(add_months(trunc(sysdate,'MM'), -1),'yyyymmdd')
用下面的where子句:
and d.created between to_date(:start_date,'yyyymmdd') and sysdate
返回的執行成本1179377.
我也想避免綁定變量,如果po因爲我不相信我可以從SAS傳遞查詢中引用他們(儘管我可能是錯的)。
這些表上的優化器統計是最新的?索引和外鍵等定義。從計劃中無法確定,但它可能無法爲輸出集計算正確的基數,然後選擇嵌套循環 – 2011-02-15 13:46:04
@MikeyByCrikey - 查詢設置爲使用索引,儘管我沒有有不幸的是有權分析數據庫/表的統計數據。 – 2011-02-15 14:15:40