【问题标题】:Role of selectivity in index scan/seek选择性在索引扫描/搜索中的作用
【发布时间】:2012-08-22 18:14:18
【问题描述】:

我在许多 SQL 书籍和文章中读到选择性是创建索引的一个重要因素。如果一列的选择性低,则索引查找的危害更大。但没有一篇文章解释原因。谁能解释为什么会这样,或者提供相关文章的链接?

【问题讨论】:

    标签: sql indexing query-optimization


    【解决方案1】:

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

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

    还可以查看这些文章:

    来自 SqlServerCentral 文章:

    一般来说,非聚集索引应该是有选择性的。那就是 列中的值应该是相当唯一的,并且过滤的查询 它应该返回表格的一小部分。

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

    如果 SQL 考虑索引(或索引键的子集) 查询将被搜索)选择性不足,那么它非常 很可能索引将被忽略并且查询作为 聚集索引(表)扫描。

    需要注意的是,这不仅仅适用于前导 柱子。在某些情况下,可以选择非常非选择性的列 用作前导列,与索引中的其他列一起使用 它的选择性足以被使用。

    【讨论】:

    • 不客气,请务必在投入生产之前进行测试,以避免停机和用户愤怒的面孔;)
    【解决方案2】:

    我试着写一个很简单的解释(基于我目前对Sql Server的了解):

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

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

    因此,当您看到这样的搜索使用两步时。选择性来了:

    由于选择性低,您得到的结果更多,引擎必须做更多的工作。因此,在某些情况下,即使是表扫描也比选择性非常低的索引查找更有效。

    【讨论】:

    • 但表扫描的结果数量也更多。至少在索引查找的情况下,跳转到包含相似记录的数据块部分会更快。
    • 但是通过表扫描,您正在读取一次obe记录,而不是两次。而且你必须计算整个过程中成本最高的非ssd硬盘中的“headmove”时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多