我在许多 SQL 书籍和文章中读到选择性是创建索引的一个重要因素。如果列的选择性较低,则索引查找会造成更大的伤害。但没有一篇文章解释原因。任何人都可以解释为什么会这样,或者提供相关文章的链接吗?
2 回答
摘自 Robert Sheldon 的 SimpleTalk 文章:14 个 SQL Server 索引问题你太害羞了
键列中唯一值的比率称为索引选择性。值越独特,选择性越高,这意味着唯一索引具有最高可能的选择性。查询引擎喜欢高度选择性的键列,特别是如果这些列在您经常运行的查询的 WHERE 子句中被引用。选择性越高,查询引擎减小结果集大小的速度就越快。当然,另一方面是唯一值相对较少的列很少是索引的好候选者。
还要检查这些文章:
- 检查Pinal Dave的这篇文章
- SQL Serverpedia 上的另一个
- SqlServerCentral 上的这个论坛帖子也可以为您提供帮助。
- SqlServerCentral 上的这篇文章也
来自 SqlServerCentral 文章:
一般来说,非聚集索引应该是有选择性的。也就是说,列中的值应该是相当唯一的,并且对其进行过滤的查询应该返回表的一小部分。
这样做的原因是键/RID 查找是昂贵的操作,如果要使用非聚集索引来评估查询,它需要覆盖或具有足够的选择性,这样查找的成本不会被认为太高。
如果 SQL 认为索引(或查询将在其上查找的索引键的子集)的选择性不足,则很可能会忽略索引并将查询作为聚集索引(表)扫描执行。
需要注意的是,这不仅仅适用于前导列。在某些情况下,可以将非常非选择性的列用作前导列,而索引中的其他列使其具有足够的选择性以供使用。
我试着写一个很简单的解释(基于我目前对Sql Server的了解):
如果索引的选择性较低,则意味着对于相同的值,找到的总行数的百分比更大。(比如 500 行中的 200 具有基于索引的相同值)
通常,如果索引不包含您需要的所有列信息,那么它使用指针,在哪里可以找到物理上连接到索引上的“条目”的行。然后在第二步中,引擎必须读出该行。
因此,当您看到这样的搜索使用两步时。这里有选择性:
由于低选择性,您得到的结果更多,引擎必须做更多的工作。因此,在某些情况下,即使是表扫描也比选择性非常低的索引查找更有效。