1

我正在优化针对遗留系统中非常宽的表的 SQL 查询。由于各种原因,我目前无法缩小表格范围。

我的查询运行缓慢,因为它对我创建的索引执行索引查找,然后使用书签查找来查找它需要的索引中不存在的其他列。书签查找占用了 42% 的查询时间(根据查询优化器)。

该表有 38 列,其中一些是 nvarchars,因此我无法创建包含所有列的覆盖索引。我试图通过创建覆盖所有列的索引来利用索引交集,但是那些“覆盖”索引没有被执行计划拾取并且没有被使用。

此外,由于通过此查询提取了 38 列中的 28 列,因此我将表中的 28/38 列存储在这些覆盖索引中,所以我不确定这有多大帮助。

您是否认为书签查找与它所获得的一样好,或者另一种选择是什么?

(我应该指定这是 SQL Server 2000)

4

2 回答 2

1

您可以创建包含列的索引作为另一种选择

来自 BOL 的示例,这是 2005 年及以后的

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
    ON Person.Address (PostalCode)
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

回答这部分“我试图通过创建覆盖所有列的索引来利用索引交集,但是那些“覆盖”索引没有被执行计划拾取并且没有被使用。仅当以可搜索的方式创建查询时才能使用索引,换句话说,如果您在运算符左侧使用函数或在 WHERE 子句中省略索引的第一列,则索引获胜不被使用。如果索引的选择性低,那么也不会使用索引

查看SQL Server 覆盖索引 以获取更多信息

于 2009-02-24T21:17:54.117 回答
1

哦,

包含的覆盖索引应该可以工作。另一种选择可能是创建一个仅包含您需要的列 的聚集索引视图。

问候,
利文

于 2009-02-24T21:27:01.427 回答