【问题标题】:Why does this query a key lookup?为什么这个查询是键查找?
【发布时间】: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


【解决方案1】:

因为 IsCategoryFirst 列很可能不在键中。和/或因为 IsCategoryFirst 上有一个单独的(单列?)索引,而它正在使用它。

【讨论】:

  • 显然,由于 order by 子句,它使用了不同的索引。有没有办法解决这个问题?
  • 您发布的查询中没有 order by 子句
  • 对不起,我稍后在调试不同的查询。
猜你喜欢
  • 2011-03-11
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2014-03-12
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多