2011-11-21 67 views
0

我在Oracle中建立索引時遇到問題。將試圖用一個實例來解釋我的問題,如下所示。錯誤索引由Oracle選擇

我與列A,B,C,d 表TABLE1另一個表TABLE2與列A,B,C,E,F,H

我已經創建指標的TABLE1

IX_1 A 
IX_2 A,B 
IX_3 A,C 
IX_4 A,B,C 
當我給

爲TABLE1

IY_1 A,B,C 
IY_2 A 

我已經創建了索引的查詢與此類似

SELECT * FROM TABLE1 T1,TABLE2 T2 
WHERE T1.A=T2.A 

當我給的解釋計劃我得到了它沒有得到IX_1也不IY_2

其採取IX_4也不IY_1

這是爲什麼不選擇正確的指數?

編輯:

誰能幫我知道索引範圍掃描之間的差異,INDEX UNIQUE SCAN,索引跳躍式掃描

我想,當一列在綜合指數由Oracle

跳過跳躍式掃描指

別人怎麼樣我沒有主意!

+4

當涉及到使用索引時,不存在_right_或_wrong_。根據成本計算,Oracle選擇最優化的執行計劃。你最近是否更新過數據庫統計信息?此外,我不明白你爲什麼有這麼多的索引。如果使用IX_4和IY_2,那麼所有可能受益於IX_1,IX_2或IY_2的查詢都可以以非常相似的成本和執行計劃執行。 – Codo

+0

謝謝科多。我沒有創建這些索引。我們正在JAROSODS數據庫上實施。他們有充足的索引。我試圖模仿我的問題。另外我沒有訪問權限來更改這些索引。只是爲了使用它們 – shanmugamgsn

+0

@Codo >>你的意思是說我們不能手動改變成本計算?你在這裏的數據庫統計數據是什麼意思? – shanmugamgsn

回答

3

索引的最大好處是可以從表中選擇幾行而不掃描整個表。 如果你要求太多的行(比如說30% - 取決於很多事情),引擎會優先掃描整個表中的行。 這是因爲使用索引讀取行會產生開銷:讀取一些索引塊,然後讀取表格塊。

在你的情況下,爲了連接表T1和T2,Oracle需要這些表中的所有行。閱讀(全部)索引將是一個不切實際的操作,增加了不必要的成本。

UPDATE:向前邁進了一步:如果您運行:

SELECT T1.B, T2.B FROM TABLE1 T1,TABLE2 T2 
WHERE T1.A=T2.A 

甲骨文可能會使用索引(IX2,IY2),因爲它不需要讀取表什麼,因爲值T1 .B,T2.B,在索引中爲

+0

但我能知道索引範圍掃描,索引獨特掃描,索引跳過掃描有什麼區別 – shanmugamgsn

+0

是弗羅林你說的是對的!通過選擇查詢中的選定列,我可能會丟失COST差異。謝謝...對不起,如果我錯了,爲什麼我的費用更改,如果我添加另一列**選擇查詢**不在索引 – shanmugamgsn

+0

在第62頁,你可以找到解釋:http://www.google.ro /url?sa=t&rct=j&q=oracle+database+concepts+11g+release+2+pdf&source=web&cd=1&ved=0CBsQFjAA&url=http%3A%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FE11882_01%2Fserver.112 %2Fe25789.pdf&EI = DG7KTtO-H6Sk4gT7t7Rl與USG = AFQjCNFC2IF4gfuwZuCviTf5XzbIw7FwvA&SIG2 = M1xI2YxRwb0KM8yuoYFRUQ –