我正在努力优化与旧系统中非常宽的表相对的SQL查询。由于各种原因,我目前无法缩小表格。
我的查询运行缓慢,因为它在我创建的索引上执行索引查找,然后使用书签查找来查找索引中不存在的所需的其他列。书签查找占用查询时间的42%(根据查询优化器)。
该表有38列,其中一些是nvarchars,因此我无法创建包含所有列的覆盖索引。我试图通过创建覆盖所有列的索引来利用索引交集,但是这些“覆盖”索引不会被执行计划选中并且不会被使用。
此外,由于38个列中有28个是通过此查询提取出来的,因此表中有28/38个列存储在这些覆盖索引中,所以我不确定这会有多大帮助。< / p>
您认为Bookmark Lookup是否会达到最佳状态,或者另一种选择是什么?
(我应该指定这是SQL Server 2000)
答案 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的覆盖索引应该有效。另一个选项可能是创建仅包含所需列的聚簇索引视图。
的问候,
利芬