选择性在索引扫描/搜索中的作用

时间:2012-08-28 08:56:21

标签: sql indexing query-optimization

我一直在阅读许多SQL书籍和文章,其中选择性是创建索引的重要因素。如果色谱柱的选择性较低,则索引搜索会带来更大的危害。但这些文章都没有解释原因。任何人都可以解释为什么会这样,或者提供相关文章的链接吗?

2 个答案:

答案 0 :(得分:8)

来自Robert Sheldon撰写的SimpleTalk文章:14 SQL Server Indexing Questions You Were Too Shy To Ask

  

键列中唯一值的比率称为索引   选择性。值越独特,选择性越高,   这意味着唯一索引具有尽可能高的选择性。   查询引擎喜欢高度选择性的键列,尤其是如果   这些列在您经常的WHERE子句中引用   运行查询。选择性越高,查询引擎越快   可以减小结果集的大小。当然,另一面是   具有相对较少的唯一值的列很少是好的   要编入索引的候选人。

另请查看这些文章:

来自SqlServerCentral文章:

  

通常,非聚集索引应该是选择性的。那就是   列中的值应该是相当唯一的,并且查询会过滤   在它上面应该返回表格的一小部分。

     

原因是密钥/ RID查找是昂贵的操作   如果要使用非聚集索引来评估它需要的查询   覆盖或充分选择查找的成本   不被认为太高。

     

如果SQL考虑索引(或索引键的子集,那么   查询将寻求不充分的选择性,然后它是非常的   可能会忽略索引并将查询作为执行执行   聚集索引(表)扫描。

     

重要的是要注意,这不仅适用于领先   柱。有些情况下非常不具备选择性的列   用作前导列,与索引中的其他列一起使用   它有选择性,可以使用。

答案 1 :(得分:3)

我尝试编写一个非常简单的解释(基于我目前对Sql Server的了解):

如果索引的选择性较低,则意味着对于相同的值,可以找到总行数的较大百分比。 (例如,500行中的200与基于索引的值相同)

通常,如果索引不包含您需要的所有列信息,那么它使用指针,在哪里查找物理上与索引上的“条目”相连的行。然后在一个secpnd步骤中,引擎必须读出该行。

所以当你看到这样的搜索使用两步时。这里有选择性:

更多的结果是因为低选择性,引擎必须做更多的双重工作。所以在某些情况下,由于这一事实,即使是表扫描也比索引搜索效率更高,效率更高。