【发布时间】: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