2014-03-19 136 views
2

如果我有一個表,其中a,b,c,d和pk b-tree索引按照(a,b,c)順序排列。我想要這樣查詢: (1)Oracle綜合索引

select b, d from table 
where a = :p1 
    and c = :p2 

即:缺少b列中的where子句以完美利用索引。現在b列只能有幾個可能的值之一(20個唯一),但c(和a)可以有很多(100 000)。我想這將是更有效地重寫查詢到:

(2)

select /*+USE_NL(table)*/ b, d from table 
where a = :p1 
    and b IN (<allPossibleValues>) 
    and c = :p2 

,但我一直沒能找到任何Oracle文檔,解釋如何在(1)作品的範圍掃描當組合索引中缺少一個非前導列時。所有來源似乎只涵蓋領先專欄丟失的情況。這些消息表明使用跳躍式掃描,像這樣:

(3)

select /*+INDEX_SS(table <theIndex>)*/ b, d from table 
where a = :p1 
    and c = :p2 

請問當缺少列不是領導之一,但這項工作的第二個(B)。正如我所說的,我發現解釋跳過掃描的所有資源都缺少領先的列。查詢(2)和/或(3)會比查詢(1)更好。

回答

0

在開始過早優化之前,請在生產環境中檢查解釋計劃和原始查詢的性能。

Oracle查詢優化器非常適合選擇正確的計劃。根據你的表的大小,它可能會選擇完整的索引掃描(我猜這個表可以通過很多行來實現),或者索引範圍掃描。

如果Oracle未能選擇性能良好的計劃,則可以開始優化。

+0

Oracle選擇一個索引範圍掃描,並且在查詢時遇到性能問題。我現在想知道如果查詢(2)或(3)可以改善這一點。我已經運行了本地測試,表明他們會,但我希望得到這個證實並理解爲什麼。 –

+0

當您切換到查詢2和查詢3時,計劃如何更改? –

+0

您可以通過爲'a,c,d'添加索引來加速它。在索引中訪問所有字段可以在查詢返回多行時真正提高性能。 –