我一直在阅读许多SQL书籍和文章,其中选择性是创建索引的重要因素。如果色谱柱的选择性较低,则索引搜索会带来更大的危害。但这些文章都没有解释原因。任何人都可以解释为什么会这样,或者提供相关文章的链接吗?
答案 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步骤中,引擎必须读出该行。
所以当你看到这样的搜索使用两步时。这里有选择性:
更多的结果是因为低选择性,引擎必须做更多的双重工作。所以在某些情况下,由于这一事实,即使是表扫描也比索引搜索效率更高,效率更高。