如何提高 SQL Server 查询的性能 [关闭]

Posted

技术标签:

【中文标题】如何提高 SQL Server 查询的性能 [关闭]【英文标题】:How to improve perfomance of SQL Server query [closed] 【发布时间】:2015-02-11 21:31:08 【问题描述】:

我在存储过程中有以下查询:

UPDATE  dbo.CRM_tblActivityStore
SET StoDateChngFlg = CASE 
             WHEN x.STAGE_STAD <> x.ACTSTR_STAD THEN 1 ELSE 0 END
FROM    (SELECT CASE 
WHEN sd.stad = '00000000' THEN '12-31-2049' ELSE CONVERT (DATE, sd.stad) 
END AS STAGE_STAD,
                CONVERT (DATE, tas.StoDateSTA) AS ACTSTR_STAD,
                tas.StoActivityNbr,
                sd.Proj_Code,
                sd.OrderNbr,
                sd.FileNbr
         FROM   [SCM Server].[OrdrMgmt].dbo.STAGE_StageData AS sd
                INNER JOIN
                dbo.CRM_tblActivityStore AS tas
                ON sd.Proj_Code = tas.StoProjCode
                   AND sd.OrderNbr = tas.StoOrderNbr
                   AND sd.FileNbr = tas.StoFile) AS x
        INNER JOIN
        dbo.CRM_tblActivityStore AS tast
        ON tast.StoActivityNbr = x.StoActivityNbr
           AND tast.StoProjCode = x.Proj_Code
           AND tast.StoOrderNbr = x.OrderNbr
           AND tast.StoFile = x.FileNbr;

更多信息可能会有所帮助:

[SCM 服务器].[OrdrMgmt].dbo.STAGE_StageData - 超过 2,000,000 行 dbo.CRM_tblActivityStore - 超过 5,000,000 行

这些表都没有索引,也没有主键。

这个需要3个多小时。

添加索引能提高多少?

还有什么改进的方法吗?

谢谢,

宜兰

【问题讨论】:

哎呀!!!没有聚集索引的表称为堆。你有几个相当大的。如果不对您的表进行一些结构更改,则几乎没有机会提高性能。您需要一个主键,然后您需要添加一些索引。没有更多细节,很难知道这些可能是什么。 第一笔交易是更新统计信息 - 索引 我注意到你在连接中使用了来自链接服务器的表。不是一个好主意(恕我直言)。如果你使用 SQL Server 2008+ - 尝试使用交叉应用 正如 DimaSUN 提到的,性能问题很可能是您的链接服务器,因为您缺少索引。发现自己处于这种情况(使用链接服务器,没有索引)并不是一个好的迹象。 【参考方案1】:

正如 David 所说,在连接列上添加索引将缩短此查询的响应时间。但是,这并没有解决这些表为什么没有主键的根本问题。主键唯一标识表中的每一行。您/真的/确定您的数据模型允许重复行吗?如果是这样,您确定这符合您的业务需求吗?是否有另一种可能更好的方法来解决您要解决的问题。

要考虑的规则: 1 - 每行唯一可识别(主键) 2 - 行中的每一列都与主键相关 3 - 每列仅对主键

您可能需要将这些表拆分为多个表。仔细考虑每个表试图描述的内容以及与其他表的关系。不要试图让任何一张表做的事情超出其主键所允许的范围。

【讨论】:

【参考方案2】:

在优化查询时,我总是从使用

包括实际执行计划

SSMS 中的选项,在查询菜单选项下。

然后,您将获得有关如何优化查询的大量信息。它甚至会为您提供它认为您需要添加的实际索引创建脚本。

祝你好运。我相信您可以将此查询缩短到几分钟。

【讨论】:

为什么投反对票?如果不重新创建他的数据库,就很难改进他的查询。因此,指导他使用适当的工具肯定会对他有所帮助。 我没有理由拒绝投票。这是试图帮助改进查询的唯一答案,而不仅仅是我知道我有问题的索引和 Primery Key。【参考方案3】:

添加一些索引会大大改善您的数据库。在您提供的查询中,您有一些连接将受益于被索引的关联列。 IE。 sd.Proj_Code = tas.StoProjCode 和 sd.OrderNbr = tas.StoOrderNbr 和 sd.FileNbr =tas.StoFile

只要您尝试匹配的字段是相同的数据类型,索引将大大缩短您的查询时间。

尝试索引一些列,然后检查规划器正在尝试做什么,看看是否应该更改索引的内容 - 单列或多列索引、主键等

【讨论】:

以上是关于如何提高 SQL Server 查询的性能 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用具有中等数据的表提高 SQL Server 查询性能

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

如何提高 Sql server 中 Distinct Query 的性能

提高 SQL Server 查询性能

sql server 2008 r2 提高性能

提高大型表上的 SQL Server 查询性能