如何提高SQL Server查询的性能

时间:2015-02-11 21:31:08

标签: sql sql-server database-performance query-performance qsqlquery

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

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 Server]。[OrdrMgmt] .dbo.STAGE_StageData - 超过2,000,000行 dbo.CRM_tblActivityStore - 超过5,000,000行

这些表都没有编入索引,也没有Primery键。

这个需要3个多小时。

添加索引可以改善多大程度?

还有其他想法如何改进吗?

谢谢,

伊兰

3 个答案:

答案 0 :(得分:1)

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

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

您可能需要将这些表分成多个表。仔细考虑每个表尝试描述的内容以及与其他表的关系。不要试图让任何一个表做超过其主键允许的表。

答案 1 :(得分:0)

优化查询时,我总是先使用

开始
  

包括实际执行计划

SSMS中的

选项,位于“查询”菜单选项下。

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

祝你好运。我确定您可以将此查询降低到几分钟。

答案 2 :(得分:0)

通过添加一些索引可以大大改善您的数据库。在您提供的查询中,您有一些联接可以从索引的关联列中受益。 即sd.Proj_Code = tas.StoProjCode和sd.OrderNbr = tas.StoOrderNbr和sd.FileNbr = tas.StoFile

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

尝试索引某些列,然后检查规划器尝试执行的操作,以查看是否应更改索引内容 - 单个或多个列索引,主键等