【发布时间】:2017-12-12 13:06:19
【问题描述】:
我试图理解为什么这个查询是一个键查找,即使我添加了我在索引中选择的所有列?
这里是查询
SELECT TOP 1
ART.Id,
ART.Title,
ART.InitialTitle,
ART.Summary,
ART.IsCategoryFirst,
ART.RootCategoryId,
CAT.Name,
ART.OldFacebookCommentsUrl,
ICO.CssClass,
ART.TopicName,
ART.MainArticlePhoto,
ART.FrontPagePhoto,
ART.PublishDate
FROM Articles ART WITH (NOLOCK)
INNER JOIN Categories CAT WITH (NOLOCK) ON CAT.Id = ART.RootCategoryId
LEFT JOIN ArticleIcons ICO WITH (NOLOCK) ON ICO.Id = ART.IconId
WHERE ART.RootCategoryId = 3
AND ART.PublishDate < GETDATE()
AND ART.Active = 1
AND IsCategoryFirst = 1
这是应该覆盖它的索引
CREATE NONCLUSTERED INDEX [SmallArticleResponse] ON [dbo].[Articles]
(
[RootCategoryId] ASC,
[Active] ASC,
[PublishDate] DESC,
[Coefficient] DESC
)
INCLUDE ( [Id],
[Title],
[InitialTitle],
[OldFacebookCommentsUrl],
[Summary],
[IconId],
[TopicName],
[FrontPagePhoto],
[MainArticlePhoto],
[FacebookPhoto],
[IsCategoryFirst]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
【问题讨论】:
-
因为 IsCategoryFirst 列不在键中,很可能。或者相反,因为它上面有一个单独的索引(单列?)并且它正在使用它。
-
就是这样。傻我
-
有点离题:你可能会发现这篇关于
with (nolock)子句的帖子很有趣 - blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere -
是哪一个?
-
@BradleyUffner Gareth 有正确答案。他可以输入,所以我可以将其标记为解决方案:)
标签: sql-server sql-execution-plan sql-optimization