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 查询的仅使用书签查找选项的索引查找?的主要内容,如果未能解决你的问题,请参考以下文章

文件查找

如何查找MySQL中查询慢的SQL语句

怎么查找执行比较慢的sql语句

在 QTabWidget 中查找选项卡的索引

如何查找MySQL中查询慢的SQL语句

如何查找MySQL中查询慢的SQL语句