哪个更好:书签/键查找或索引扫描
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 提到键查找是要避免的。索引查找肯定是性能更好的操作。
【讨论】:
以上是关于哪个更好:书签/键查找或索引扫描的主要内容,如果未能解决你的问题,请参考以下文章