【发布时间】:2012-08-22 18:14:18
【问题描述】:
我在许多 SQL 书籍和文章中读到选择性是创建索引的一个重要因素。如果一列的选择性低,则索引查找的危害更大。但没有一篇文章解释原因。谁能解释为什么会这样,或者提供相关文章的链接?
【问题讨论】:
标签: sql indexing query-optimization
我在许多 SQL 书籍和文章中读到选择性是创建索引的一个重要因素。如果一列的选择性低,则索引查找的危害更大。但没有一篇文章解释原因。谁能解释为什么会这样,或者提供相关文章的链接?
【问题讨论】:
标签: sql indexing query-optimization
来自 Robert Sheldon 的 SimpleTalk 文章:14 SQL Server Indexing Questions You Were Too Shy To Ask
键列中唯一值的比率称为索引 选择性。值越独特,选择性越高, 这意味着唯一索引具有最高可能的选择性。 查询引擎喜欢高度选择性的键列,尤其是如果 这些列在您的 WHERE 子句中经常被引用 运行查询。选择性越高,查询引擎越快 可以减小结果集的大小。当然,另一方面是 具有相对较少唯一值的列很少是好的 被索引的候选人。
还可以查看这些文章:
来自 SqlServerCentral 文章:
一般来说,非聚集索引应该是有选择性的。那就是 列中的值应该是相当唯一的,并且过滤的查询 它应该返回表格的一小部分。
这样做的原因是键/RID 查找是昂贵的操作 如果要使用非聚集索引来评估它需要的查询 覆盖或充分选择查找的成本 不会被认为太高。
如果 SQL 考虑索引(或索引键的子集) 查询将被搜索)选择性不足,那么它非常 很可能索引将被忽略并且查询作为 聚集索引(表)扫描。
需要注意的是,这不仅仅适用于前导 柱子。在某些情况下,可以选择非常非选择性的列 用作前导列,与索引中的其他列一起使用 它的选择性足以被使用。
【讨论】:
我试着写一个很简单的解释(基于我目前对Sql Server的了解):
如果索引的选择性较低,则意味着对于相同的值,找到的总行数的百分比更大。 (比如 500 行中的 200 行基于您的索引具有相同的值)
通常,如果索引不包含您需要的所有列信息,那么它使用一个指针,在哪里可以找到物理上连接到索引上的“条目”的行。然后在第二步中,引擎必须读出该行。
因此,当您看到这样的搜索使用两步时。选择性来了:
由于选择性低,您得到的结果更多,引擎必须做更多的工作。因此,在某些情况下,即使是表扫描也比选择性非常低的索引查找更有效。
【讨论】: