我在Oracle 11g中編寫了以下SQL查詢。如何減少Oracle中以下查詢的執行時間?
SELECT p.matchcode pmatchcode,
p1.matchcode p1matchcode,
p.digits digit,
p1.effectivedate peff,
p1.expirydate pexp,
p.expirydate p1exp,
p.tariff_id tariff_id
FROM tt_matchcodes_view p1
JOIN tt_matchcodes_view p
on p.tariff_id = p1.tariff_id
AND p.type_id = p1.type_id
AND p1.Digits = p.Digits
AND p.matchcode <> p1.matchcode
AND p1.EffectiveDate < p.expirydate
AND (p1.expirydate IS NULL OR p1.expirydate > p.expirydate)
AND substr(p.matchcode, 0, length(p1.matchcode)) = p1.matchcode;
的tt_matchcodes_view
表有71392條記錄。我在字段matchcode and digits
上的表上創建了兩個索引。執行時間超過10分鐘。無論如何減少執行時間。
樣品表中的數據:
MATCHCODE DIGITS DEST_ID MATCH EFFECTIVEDATE EXPIRYDATE INHERITED TARIFF_ID TYPE_ID
1787 1787 73999 1 01/03/2012 0 22 1
1787201 1787 73999 0 01/03/2012 -1 22 1
1787202 1787 73999 0 01/03/2012 -1 22 1
1787203 1787 73999 0 01/03/2012 -1 22 1
1787204 1787 73999 0 01/03/2012 -1 22 1
1787205 1787 73999 0 01/03/2012 -1 22 1
1787206 1787 73999 0 01/03/2012 -1 22 1
1787207 1787 73999 0 01/03/2012 -1 22 1
1787208 1787 73999 0 01/03/2012 -1 22 1
1787212 1787 73999 0 01/03/2012 -1 22 1
執行計劃:
OPERATION OPTIONS OBJECT_NAME OBJECT_INSTANCE OPTIMIZER ID PARENT_ID DEPTH POSITION COST CARDINALITY BYTES CPU_COST IO_COST
SELECT STATEMENT ALL_ROWS 0 0 703 703 3 501 83322403 698
HASH JOIN 1 0 1 1 703 3 501 83322403 698
TABLE ACCESS FULL TT_MATCHCODES_VIEW 2 2 1 2 1 95 65498 5174342 22711001 94
TABLE ACCESS FULL TT_MATCHCODES_VIEW 1 3 1 2 2 95 65498 5763824 22711001 94
Thx提前。
爲什麼你有'substr(p.matchcode,0,length(p1.matchcode))'?這是沒有意義的。同樣@GauravSoni提到,請編輯並添加執行計劃 – Sathya 2012-03-27 10:05:14
您將'tt_matchcodes_view'描述爲表,但它的名稱暗示着不同的東西。那麼,它真的是一張桌子,還是它實際上是一個視圖? – APC 2012-03-27 10:13:47
P1的匹配碼應出現在P匹配碼中。這就是爲什麼我在那裏保持SUBSTR。 tt_matchcodes_view只是一個臨時表,不是一個視圖[忽略名稱]。 – 2012-03-27 10:19:19