2016-03-02 61 views
0

我第一次使用數據庫中的索引,到目前爲止我已經瞭解到,如果您有索引('col1','col2','col3')等多列索引, ,如果你做了一個使用col2 ='col2'和col3 ='col3'的查詢,那麼該索引就不會被使用。db2 10.5多列索引解釋

我還了解到,如果一列色譜柱的選擇性非常低。索引是無用的。 但是,從我的測試來看,上述情況似乎都不是真的。有人能解釋更多嗎?

我有一個超過1600萬條記錄的表格。假設claimID是主鍵,那麼有一個historynumber列只有3個不同的值(1,2,3),而storeNumber的最後一列有大約100萬個不同的值。

我有一個唯一的claimID索引,另一個索引(historynumber,claimID)和索引(historynumber,storeNumber)和最後索引(storeNumber,historynumber)的其他索引。

我的猜測是,如果我做的:

select * from my_table where claimId='123456' and historynumber = 1 

會比

select * from my_table where historynumber = 1 and claimId = '123456' 

但是快得多,2具有完全相同的性能(即時)。所以我認爲主鍵索引可以在任何列順序上工作。因此,我嘗試了相同的事情,只是在historynumber和storeNumber上進行。結果完全一樣。然後我開始嘗試沒有索引的列,當然結果也是一樣的。

最後,我做了

select * from my_table where historynumber = 1 

和查詢需要很長時間,我不得不取消它。

所以我的結論是where子句中的列順序是完全無用的,索引定義中的列順序也是如此,因爲看起來數據庫足夠聰明,可以告訴哪個列是最高選擇性列。

有人能給我一個可以證明的例子嗎?

回答

0

指數解釋是一個巨大的話題。 不要擔心在SQL不同屬性的順序 - 它是否指定

...where claimId='123456' and historynumber = 1 

或其他方式輪沒有影響。每個SQL都由優化器進行檢查和優化。爲了證明數據如何被訪問,你可以做一個解釋。檢查文檔以獲取更多詳細信息。

您的其他問題

select * from my_table where historynumber = 1 

與(storeNumber,historynumber)的索引。 你有沒有試過在電話簿中查詢來電者的名字(有電話號碼)? 對於一個指數來說,它幾乎是一樣的 - 所以當創建索引時的列順序很重要! 有些技術可以幫助 - 即索引跳轉掃描 - 但不能保證。

退房以下網站了解更多一點關於DB2索引:

http://db2commerce.com/2013/09/19/db2-luw-basics-indexes/

http://use-the-index-luke.com/sql/where-clause/the-equals-operator/concatenated-keys

+0

嘿,感謝回答。第二個查詢不是問題。我只是確保historynumber = 1的查詢需要很長時間而不是立即執行,否則我的其他測試會失敗。我今天做了很多研究,所有人都表示這個訂單會有所作爲。我無法找到我今天閱讀的所有鏈接,但這裏有一些情況如此: [link1](http://stackoverflow.com/questions/179085/multiple-indexes-vs-multi-column - 指數) [鏈接2](http://stackoverflow.com/questions/5542895/sql-indexes-and-performance-improvement) – user3758745

+0

那麼缺少什麼?否則,我的答案恰恰恰到好處? – MichaelTiefenbacher

+0

這些鏈接正在討論MS SQL Server。索引的使用通常是DBMS特有的。在DB2上,'WHERE'中的順序並不重要...並且在DB2上我至少建議最有選擇性的列首先在索引中。同樣在DB2 for i上,'historynumber = 1'查詢可能使用全表掃描,因爲查詢引擎可能會確定超過30%的行將被返回。 – Charles