哪个更好:书签/键查找或索引扫描

Posted

技术标签:

【中文标题】哪个更好:书签/键查找或索引扫描【英文标题】:Which is better: Bookmark/Key Lookup or Index Scan 【发布时间】:2010-11-26 14:05:10 【问题描述】:

我知道索引 seek 比索引 scan 好,但在 SQL Server 解释计划中更可取:索引搜索或键查找(SQL Server 中的书签2000)?

请告诉我他们没有再次更改 SQL Server 2008 的名称...

【问题讨论】:

问题的内容问的是一件事,标题是另一件事.... 【参考方案1】:

索引搜索,每次。

查找成本很高,因此这是覆盖索引,特别是添加了 INCLUDE 子句以使其更好。

例如,如果您只期望一行,那么在查找之后进行查找可能比尝试覆盖查询更好。我们依靠这一点来避免在某些情况下出现另一个索引。

编辑:简单的谈话文章:Using Covering Indexes to Improve Query Performance

编辑,2012 年 8 月

查找发生在每行,这就是它们无法扩展的原因。最终,优化器将选择聚集索引扫描而不是 seek+lookup,因为它比许多查找更有效。

【讨论】:

+1 用于覆盖索引和 Simple-Talk 链接(优秀的东西)【参考方案2】:

Key lookup非常类似于聚集索引查找(2005 年之前的 SP2 被命名为“查找查找”)。我认为唯一的区别是 Key Lookup 可能会指定一个额外的 PRE-FETCH 参数,指示执行引擎在集群中预取更多的键(即先进行聚集索引查找,然后进行扫描)。

看到 Key Lookup 不会吓到您。是嵌套循环中使用的普通运算符,而嵌套循环是普通的连接运算符。如果您想改进计划,请尝试改进连接,看看它是否可以使用合并连接(即连接的两侧可以提供相同键顺序的行,最快连接)或哈希连接(有足够的内存让 QO 考虑哈希连接,或者通过在连接之前而不是之后过滤行来减少基数)。

【讨论】:

你确定...键查找是书签查找 = 昂贵,不是吗? afaik 与 seek 一样昂贵,它转换为相同的物理操作。 存在虽然表示潜在问题,如slonon覆盖索引。请注意,使用连接查找可能优于查找,因为查找可以指定预取。 slonon-convering indexes => slow joins or non-covering indexes(错字) 顺便说一句,当然,一次查找 + 查找比一次查找更昂贵,因此,如果您可以将查找+查找转换为单个查找(即覆盖索引),无论如何是的,更好。我的观点是,查找是昂贵的还是查找的,但是 为什么 QO 选择使用查找(即需要覆盖预计的列) 总而言之,如果您以某种方式更改计划,将一次查找替换为一次查找,则实际上一无所获。真正的解决方案必须消除查找的原因并制定一个计划,例如,在以前使用查找查找的情况下进行一次查找。【参考方案3】:

This SO question 提到键查找是要避免的。索引查找肯定是性能更好的操作。

【讨论】:

以上是关于哪个更好:书签/键查找或索引扫描的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server索引的执行计划

将聚簇索引扫描优化为聚簇索引查找

SQL 查询的仅使用书签查找选项的索引查找?

SQL Server 索引查找Index Seek 索引扫描 Index Scan与索引存储原理详解

二级/辅助/非聚簇索引

索引的访问-SQL Server