【问题标题】:How to enhance query to make it run fast and less time?如何增强查询以使其运行速度更快、时间更短?
【发布时间】:2020-11-11 16:54:45
【问题描述】:

我在处理 SQL Server 2012 查询时遇到问题:运行查询时仅返回 10 行的一部分

这需要 50 秒我尝试在另一个时间运行它可能是 PC 有更多负载

但只为一个部分返回 10 行需要同样的时间 50 秒。

10 行 50 秒更多

我有 10000 个零件和 1500 万个相关记录,因此我需要提高性能以达到最佳状态

所以我该怎么做才能让查询在短时间内运行

这是我的查询:

见下面的执行计划:

https://www.brentozar.com/pastetheplan/?id=HyclwfSev

我尝试通过以下方式解决问题:

CREATE NONCLUSTERED INDEX index1 
ON [dbo].[Excel_DK] ([PartNumber]) INCLUDE ([ZPartId],[FeatureName],[Value])

但返回 10 行还需要 25 秒

有什么办法可以提高性能

【问题讨论】:

  • 我认为一个好的开始是右键单击查询并在上下文菜单中选择:“Analyze Query in database engine tune advisor”。而且,问题缺少实际查询,因此您需要将其包含在问题中
  • 您在 PasteThePlan 上发布的执行计划是在添加非聚集索引 [index1] 之前还是之后?如果是之后,您可能想尝试在查询末尾临时添加一个 RECOMPILE 选项并再次执行。您可能希望将聚集索引添加到 #getDeliveryConfiguration 表,其键列为 DK_Feature
  • 此外,如果您使用声明的变量,行估计可能会有所偏差:[dba.stackexchange.com/questions/84626/….尝试将其捆绑为存储过程,甚至是临时过程。

标签: sql tsql sql-server-2012 sql-execution-plan sqlperformance


【解决方案1】:

从您的执行计划看来,您的临时表中的数据大约是~ 400 000 行。最近,由于过滤(使用INNER JOINWHERE 子句),数据流减少到10 行。

临时表本身似乎很大——Estimate data size1 MB,但实际是28 MB

在下一个屏幕截图中可以很容易地看到上面的内容(检查每个块之后的行):

因此,您可以做的是创建较小版本的临时表并提前应用过滤。例如:

SELECT FM.Z_FeatureID, FM.StatusId,FM.SplitFlag,FM.DkFeatureId,FM.separator,FM.separatororder
INTO #TEMP
from #getDeliveryConfiguration FM with(nolock)  
join [Excel_DK].dbo.Excel_DK DUFP with(nolock) on DUFP.FeatureName =FM.DK_Feature 
join [Z2DataCompanyManagement].[CompanyManagers].[Company] C with(nolock) on p.CompanyID = C.CompanyID
where C.CompanyName=@companyName And DUFP.PartNumber=@partNumber

然后替换原始查询中的#TEMP。当然,你可以尝试另一种过滤,但想法是提前限制行数,而不是从其他表中读取数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多