簡體   English   中英

選擇性在索引掃描/搜索中的作用

[英]Role of selectivity in index scan/seek

我一直在閱讀許多SQL書籍和文章中,選擇性是創建索引的重要因素。 如果色譜柱的選擇性較低,則索引搜索會帶來更大的危害。 但這些文章都沒有解釋原因。 任何人都可以解釋為什么會這樣,或提供相關文章的鏈接?

來自Robert Sheldon的SimpleTalk文章: 14個SQL Server索引問題,你太害羞了

關鍵列中唯一值的比率稱為索引選擇性。 值越獨特,選擇性越高,這意味着唯一索引具有盡可能高的選擇性。 查詢引擎喜歡高度選擇性的鍵列,尤其是在經常運行的查詢的WHERE子句中引用這些列的情況下。 選擇性越高,查詢引擎可以越快地減小結果集的大小。 當然,另一方面,具有相對較少的唯一值的列很少是被索引的好候選者。

另請查看這些文章:

從SqlServerCentral文章:

通常,非聚集索引應該是選擇性的。 也就是說,列中的值應該是相當獨特的,並且對其進行過濾的查詢應該返回表的一小部分。

這樣做的原因是密鑰/ RID查找是昂貴的操作,並且如果要使用非聚集索引來評估查詢,則需要覆蓋或有足夠的選擇性以使查找的成本不被認為太高。

如果SQL認為索引(或查詢將要搜索的索引鍵的子集)選擇性不足,那么很可能會忽略索引並將查詢作為聚簇索引(表)掃描執行。

重要的是要注意,這不僅適用於前導列。 在某些情況下,非常非選擇性的列可以用作前導列,索引中的其他列使其具有足夠的選擇性以供使用。

我嘗試寫一個非常簡單的解釋(基於我目前對Sql Server的了解):

如果索引的選擇性較低,則意味着對於相同的值,可以找到總行數的較大百分比。 (如500行中的200與您的索引上的值相同)

通常,如果索引不包含您需要的所有列信息,那么它使用指針,在哪里找到物理上與索引上的“條目”相連的行。 然后在一個secpnd步驟中,引擎必須讀出該行。

所以當你看到這樣的搜索使用兩步。 這里有選擇性:

更多的結果是因為低選擇性,引擎必須做更多的雙重工作。 因此,在某些情況下,由於這一事實,即使是表掃描也比具有非常低選擇性的索引搜索更有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM