我有一个查询:
UPDATE TOP(100000) pv
SET pv.intUrlId = urls.intUrlId
FROM [schema1].[Urls] urls WITH(NOLOCK)
INNER JOIN [schema2].[PageViews] pv WITH(NOLOCK)
ON pv.urlId = urls.id
AND pv.intUrlId IS NULL
此查询中使用的每一列都是一个索引,urls.id 是一个主键。但是查询还是太慢了。为了提高性能,我重建了 pv_urlId_IDX 索引,将 pv.intUrlId 列添加为“包含列”。我的推理如下:查询需要搜索 pv_urlId_IDX 索引来执行 JOIN 和下一个 pv_intUrlId_IDX 以确定 NULL 记录。如果我将 pv.intUrlId 的值添加到 pv_urlId_IDX 索引,则会“就地”执行第二个条件的测试,并且不会执行搜索第二个索引。不幸的是,我没有注意到任何性能提升。
我还阅读了 SQL Server 文档,他们每次都在包含列的范围内提到非键列。所以我的问题是:在索引中包含键列是否有意义,如果我们可以从这种解决方案中受益。