SQL 查询的仅使用书签查找选项的索引查找?
Posted
技术标签:
【中文标题】SQL 查询的仅使用书签查找选项的索引查找?【英文标题】:Index Seek with Bookmark Lookup Only Option for SQL Query? 【发布时间】:2009-02-24 21:06:13 【问题描述】:我正在优化针对遗留系统中非常宽的表的 SQL 查询。由于各种原因,我目前无法缩小表格范围。
我的查询运行缓慢,因为它在我创建的索引上执行索引查找,然后使用书签查找来查找它需要的索引中不存在的其他列。书签查找占用了 42% 的查询时间(根据查询优化器)。
该表有 38 列,其中一些是 nvarchars,因此我无法创建包含所有列的覆盖索引。我试图通过创建覆盖所有列的索引来利用索引交集,但是那些“覆盖”索引不会被执行计划拾取并且不会被使用。
另外,由于 38 列中有 28 列是通过此查询提取的,因此我会将表中 28/38 的列存储在这些覆盖索引中,所以我不确定这有多大帮助。
您认为 Bookmark Lookup 是否与它所获得的一样好,或者另一种选择是什么?
(我应该指定这是 SQL Server 2000)
【问题讨论】:
【参考方案1】:哦,
包含的覆盖索引应该可以工作。另一种选择可能是创建一个聚集索引视图,只包含您需要的列。
问候, 利文
【讨论】:
【参考方案2】:您可以创建包含列的索引作为另一种选择
来自 BOL 的示例,适用于 2005 年及以后
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
回答这部分“我试图通过创建覆盖所有列的索引来利用索引交集,但是那些“覆盖”索引没有被执行计划拾取并且没有被使用。 仅当以可搜索的方式创建查询时才能使用索引,换句话说,如果您在运算符左侧使用函数或在 WHERE 子句中省略索引的第一列,则索引获胜不被使用。如果索引的选择性低,那么索引也不会被使用
查看SQL Server covering indexes 了解更多信息
【讨论】:
抱歉 - 我应该指定这是 SQL 2000。以上是关于SQL 查询的仅使用书签查找选项的索引查找?的主要内容,如果未能解决你的问题,请参考以下文章