索引寻找具有书签查找唯一的SQL查询选项?

时间:2009-02-24 21:06:13

标签: sql-server indexing query-optimization

我正在努力优化与旧系统中非常宽的表相对的SQL查询。由于各种原因,我目前无法缩小表格。

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

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

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

您认为Bookmark Lookup是否会达到最佳状态,或者另一种选择是什么?

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

2 个答案:

答案 0 :(得分:1)

您可以使用包含的列创建索引作为另一个选项

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

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

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

查看SQL Server covering indexes了解更多信息

答案 1 :(得分:1)

OH,

带有include的覆盖索引应该有效。另一个选项可能是创建仅包含所需列的聚簇索引视图

的问候,
利芬