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)更好。
Oracle選擇一個索引範圍掃描,並且在查詢時遇到性能問題。我現在想知道如果查詢(2)或(3)可以改善這一點。我已經運行了本地測試,表明他們會,但我希望得到這個證實並理解爲什麼。 –
當您切換到查詢2和查詢3時,計劃如何更改? –
您可以通過爲'a,c,d'添加索引來加速它。在索引中訪問所有字段可以在查詢返回多行時真正提高性能。 –