我有以下查詢在Oracle10g中:如何索引表以優化此Oracle SELECT查詢?
select *
from DATA_TABLE DT,
LOOKUP_TABLE_A LTA,
LOOKUP_TABLE_B LTB
where DT.COL_A = LTA.COL_A (+)
and DT.COL_B = LTA.COL_B (+)
and LTA.COL_C = LTB.COL_C
and LTA.COL_B = LTB.COL_B
and (DT.REF_TXT = :refTxt or DT.ALT_REF_TXT = :refTxt)
and DT.CREATED_DATE between :startDate and :endDate
,並想知道你是否已經得到了優化查詢的任何提示。
目前我有以下指標:
IDX1 on DATA_TABLE (REF_TXT, CREATED_DATE)
IDX2 on DATA_TABLE (ALT_REF_TXT, CREATED_DATE)
LOOKUP_A_PK on LOOKUP_TABLE_A (COL_A, COL_B)
LOOKUP_A_IDX1 on LOOKUP_TABLE_A (COL_C, COL_B)
LOOKUP_B_PK on LOOKUP_TABLE_B (COL_C, COL_B)
注意,查找表是非常小的(< 200行)。
編輯:
解釋計劃:
Query Plan
SELECT STATEMENT Cost = 8
FILTER
NESTED LOOPS
NESTED LOOPS
TABLE ACCESS BY INDEX ROWID DATA_TABLE
BITMAP CONVERSION TO ROWIDS
BITMAP OR
BITMAP CONVERSION FROM ROWIDS
SORT ORDER BY
INDEX RANGE SCAN IDX1
BITMAP CONVERSION FROM ROWIDS
SORT ORDER BY
INDEX RANGE SCAN IDX2
TABLE ACCESS BY INDEX ROWID LOOKUP_TABLE_A
INDEX UNIQUE SCAN LOOKUP_A_PK
TABLE ACCESS BY INDEX ROWID LOOKUP_TABLE_B
INDEX UNIQUE SCAN LOOKUP_B_PK
EDIT2:
的數據是這樣的:
有將不同REF_TXT的10000S,其中10-100s CREATED_DTs的爲每個。 ALT_REF_TXT將大部分爲NULL,但將會有100s-1000s,它將與REF_TXT不同。
EDIT3:修正ALT_REF_TXT實際包含的內容。
你也許同樣會刪除'(+)'S,由於內從LTA加入到LTB殺死他們一起嘗試創建外。 –
請提供解釋計劃 –
我確實相信Oracle也有明確的連接語法,這是一種編碼外連接的隱藏方法。從1989年開始使用SQL '92語法。 – Johan