2015-11-03 95 views
1

我的問題與this one類似,但有一點點不同。我有一個查詢在多個WHERE條件下的單個表上運行。查詢可以使用同一個表中的多個索引嗎?

假設我的表中有多個列(COL1 - col9),我有這樣一個查詢:

SELECT 
    col1 
    , col5 
FROM table1 
WHERE col1 = 'a' 
    AND col2 = 'b' 
    AND col3 = 100 
    AND col4 = '10a' 
    AND col5 = 1 

我的指標是:

  • COL1 - 獨特/非分區
  • col2,col3 - 非唯一/分區
  • col4,col5 - 非唯一/分區

我的問題是,如果我使用涵蓋多個索引的WHERE子句中的列,(應該?)查詢首先選擇唯一索引以生成結果集,然後在該結果集上使用另外兩個索引進行進一步過濾,從而依次減少結果集?

或者每個索引都會遍歷表中的所有數據,每個條件將使用索引,然後合併所有結果集?

我沒有訪問表/數據,這比實際的更理論)。

預先感謝您的任何幫助

+3

不確定爲什麼它與上一個問題不同,因爲它也適用於一個表。 Oracle使用哪種指數取決於每種選擇性 - 或基於統計數據的CBO認爲選擇性是什麼 - 等等。閱讀關於查詢優化器以及它如何做出決定; [索引加入](http://docs.oracle.com/cd/E29597_01/server.1111/e16638/optimops.htm#i56068)可能是你感興趣的東西。(和[索引提示說明](http ://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#BABEFDFC)可能會解釋發生了什麼。) –

+0

@AlexPoole感謝您的意見! –

+2

由於'col1'上的索引是一個唯一索引,並且您在'col1 ='a''上過濾,所以Oracle很明顯只會使用這個索引。其他任何事情都會浪費資源。 –

回答

3

Oracle的優化器(在最近版本的Oracle,除非你強迫它在其它方面工作)是基於而不是基於規則的成本。當查詢第一次執行時,它會考慮許多不同的路徑來獲得答案,並選擇成本最低的路徑。

因此,通常不可能提前說出數據庫將如何選擇回答特定查詢。答案總是 - 取決於。這取決於

  • 該表的統計數據,和不同的價值觀對每一列
  • 您使用
  • 系統和會話參數
  • 統計指標
  • 數據庫的版本號

一般來說,它在大多數情況下會做的是選擇最具選擇性的索引。所以如果你只有一行或兩行col1 ='a',它可能會進入該索引,然後掃描其中的行。

正如其他答案所述,數據庫可以通過位圖轉換階段組合B-Tree索引。這是相對昂貴的,並不適用於所有Oracle版本,但可能會發生。

因此,總之,數據庫可以做你提到的任何一種方法。要知道在您的情況下做什麼的唯一方法是使用解釋計劃或等效工具來觀察它的作用

相關問題