2010-06-03 48 views
0

如果我有一個Oracle查詢象下面這樣:有關Oracle索引簡單的問題

SELECT * FROM table_a where A = "1", B = "2", C = "3" 

此查詢皮卡表-A的指標之一...沒有索引必須對這些列的所有3 ?

我所問的是:

  1. 如果指數是在A,B,C,d?

  2. 如果指數在B,C上怎麼辦?

  3. 只有當 在A,B,C上時纔會選取索引嗎?

+0

取決於列的選擇性.... – 2010-06-03 05:29:45

+0

文字值由單引號',而不是雙引號「 – 2010-06-03 06:21:55

回答

5

Oracle基於成本的優化器(CBO)嘗試選擇表中最便宜的訪問路徑。訪問單個表的路徑包括索引範圍掃描,索引完整掃描和表完整掃描; CBO將估算每個計劃的成本,並選擇成本最低的計劃。

1.如果指數是在A,B,C,D上怎麼辦?

是的,Oracle可能會使用這個索引 - 並且成本可能很低,因爲索引的前導列(其中3個)在您的查詢中受到限制。

2.如果指數在B,C上怎麼辦?

是的,Oracle可能會使用這個索引 - 並且由於索引的所有列都在您的查詢中受到限制,因此成本可能會相當低。

3.索引只能在A,B,C上選取嗎?

不,它不是排他性的。是的,Oracle可能會使用這個索引 - 並且成本可能很低,因爲索引的所有列都被限制在您的查詢中。

其他因素需要考慮:

  • 查詢從表中選擇*(所有列)。如果表只有四列(A,B,C,D),那麼CBO可能會更喜歡一個完全根據(A,B,C,D)上的索引滿足查詢的計劃,根本不訪問表。
  • 你沒有問更有趣的問題:「如果索引是D,C,B,A?」 - 答案是肯定的,Oracle可能會使用該索引(例如,索引全掃描或索引跳躍掃描)。只是認爲我會把它扔在那裏:)