【问题标题】:Slow Running Query - Will Indexes Help? Not sure what to do with Execution Plan运行缓慢的查询 - 索引会有帮助吗?不确定如何处理执行计划
【发布时间】:2016-05-06 00:54:00
【问题描述】:

我在下面有一个运行缓慢的查询,它在一分半钟内返回 SQL Server 2014 中的 3,023 行。我有什么办法可以加快速度吗?

我在它加入的所有字段上都有索引。 ArticleAuthor 有 9900 万行,#ArticleAuthorTemp 很快就被我需要从 ArticleAuthor(3,023 行)的所有 ID 填充,执行计划成本为 0%。我只是为此目的填充了临时表,以限制它在您在此处看到的查询中所做的事情。

以下查询的执行计划表明它花费最多的时间在 2 次键查找和一次索引查找上,每一项都大约 30%。我不确定如何从这些创建所需的索引,或者这是否会有所帮助?一种新的索引东西。我讨厌只在所有内容上添加索引。即使没有 2 LEFT JOINS 或外部查询,它也很慢,所以我认为真正的问题在于 ArticleAuthor 表。您也会在下表中看到我的索引... :)

如果有帮助,我可以提供您需要的有关执行计划的任何信息。

SELECT tot.*,pu.LastName+', '+ ISNULL(pu.FirstName,'') CreatedByPerson,COALESCE(pf.updateddate,pf.CreatedDate) CreatedDatePerson 
from (      
    SELECT  CONVERT(VARCHAR(12), AA.Id) ArticleId
            , 0 Citations
            , AA.FullName
            , AA.LastName
            , AA.FirstInitial
            , AA.FirstName GivenName
            , AA.Affiliations
    FROM ArticleAuthor AA WITH (NOLOCK) 
    INNER JOIN #ArticleAuthorTemp AAT ON AAT.Id = AA.Id
)tot LEFT JOIN AcademicAnalytics..pub_articlefaculty pf WITH (NOLOCK) ON tot.ArticleId = pf.SourceId
    LEFT JOIN AAPortal..portal_user pu on pu.id = COALESCE(pf.updatedby,pf.CreatedBy) 

索引:

CREATE CLUSTERED INDEX [IX_Name] ON [dbo].[ArticleAuthor]
(
[LastName] ASC,
[FirstName] ASC,
[FirstInitial] ASC
)

CREATE NONCLUSTERED INDEX [IX_ID] ON [dbo].[ArticleAuthor]
(
[Id] ASC
)

CREATE NONCLUSTERED INDEX [IX_ArticleID] ON [dbo].[ArticleAuthor]
    (
[ArticleId] ASC
    )

【问题讨论】:

  • 您应该做的第一件事就是摆脱那些 NOLOCK 提示。它们不是性能增强工具。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere 您还应该在对象上指定架构。这没什么好处,但引擎必须为执行查询的用户查找默认模式。你可以在这里发布实际的执行计划吗?
  • 我会从最外层到最内层注释掉每个连接和引用,直到遇到瓶颈,然后专注于该关系中实体的索引。
  • 在只运行了最里面的查询和 NOLOCK 之后,仍然花了整整一分钟。 94% 的查询执行计划都在键查找上。我似乎无法在评论中添加图片,但它告诉我它在:对象:ArticleAuthor.IX_Name 和输出列表:ArticleAuthor.FullName 和 ArticleAuthor.Affiliations。
  • 派生表tot 是不必要的。不知道是否会损害您的执行计划,但很可能。直接加入所有这些表,并从最顶部的#ArticleAuthorTemp 开始。
  • 为什么您要转换 ArticleAuthor.ID?这足以使任何索引无效。确保临时表的 ID 列具有相同的类型一个索引,然后加入它。

标签: sql-server tsql indexing sql-server-2014


【解决方案1】:

Google CREATE INDEX 语句并了解 INCLUDES 部分。使用 INCLUDES 通过包含查询需要返回的所有列来消除键查找。

【讨论】:

  • 感谢@TabAlleman。我也会试试这个。这是否会损害可能针对不需要 INCLUDES 中所有这些额外列的表运行的其他查询?索引对我来说有点神秘,仍在学习中。 ;)
  • 否,添加 INCLUDES 不会影响其他不需要包含列的 SELECT 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2011-01-22
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多