Sql server 运行缓慢的查询-索引有帮助吗?不确定如何处理执行计划

Sql server 运行缓慢的查询-索引有帮助吗?不确定如何处理执行计划,sql-server,tsql,indexing,sql-server-2014,Sql Server,Tsql,Indexing,Sql Server 2014,下面是一个运行缓慢的查询,它在整整一分钟半的时间内返回SQL Server 2014中的3023行。我能做些什么来加快速度吗 我有它所连接的所有字段的索引。ArticleAuthor有9900万行,并且#ArticleAuthorTemp可以很快地提前从ArticleAuthor(3023行)获得我需要的所有ID,执行计划的成本为0%。我填充temp表只是为了限制它在这里看到的查询中执行的操作 下面查询的执行计划是,它在两个键查找和一个索引查找上花费的时间最多,每一项大约占30%。我不知道如何从

下面是一个运行缓慢的查询,它在整整一分钟半的时间内返回SQL Server 2014中的3023行。我能做些什么来加快速度吗

我有它所连接的所有字段的索引。ArticleAuthor有9900万行,并且#ArticleAuthorTemp可以很快地提前从ArticleAuthor(3023行)获得我需要的所有ID,执行计划的成本为0%。我填充temp表只是为了限制它在这里看到的查询中执行的操作

下面查询的执行计划是,它在两个键查找和一个索引查找上花费的时间最多,每一项大约占30%。我不知道如何从这些索引中创建所需的索引,或者这是否有帮助?这是一种新的索引。我不喜欢把索引放在所有东西上。即使没有2个左连接或外部查询,速度也非常慢,所以我认为真正的问题在于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
    )

谷歌创建索引语句并了解包含部分。使用INCLUDES可以通过包含查询需要返回的所有列来消除键查找。

您应该做的第一件事是去掉那些NOLOCK提示。它们不是性能增强工具。您还应该在对象上指定模式。这没有多大好处,但引擎必须为执行查询的用户查找默认模式。你能在这里发布实际的执行计划吗?我会从最外层到最内层注释掉每个连接和引用,直到遇到瓶颈,然后专注于该关系中实体的索引。在只运行最内层的查询和NOLOCK之后,仍然花了整整一分钟的时间。94%的查询执行计划在密钥查找上。我似乎无法在这里的评论中添加图像,但它告诉我它位于:OBJECT:ArticleAuthor.IX_Name和输出列表:ArticleAuthor.FullName和ArticleAuthor.Affiliations。派生表
tot
是不必要的。不知道是否会影响你的执行计划,但很有可能。直接连接所有这些表,从顶部的
#ArticleAuthorTemp
开始。为什么要转换ArticleAuthor.ID?这足以使任何索引无效。确保临时表的ID列具有相同的类型和索引,并在此基础上进行连接。谢谢@TabAlleman。我也要试试这个。这是否会影响可能针对不需要包含中所有额外列的表运行的其他查询?索引对我来说有点神秘,仍在学习中否,添加包含不会影响其他不需要包含列的SELECT查询。