如何提高SQL Server查询的性能



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

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-有超过2000000行dbo。CRM_tblActivityStore-超过5000000行

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

这个需要3个多小时。

增加索引能提高多大的清晰度?

还有其他改进的想法吗?

谢谢,

Ilan

正如David所说,在联接列上添加索引将提高此查询的响应时间。然而,这并不能解决为什么这些表没有主键的根本问题。主键唯一地标识表中的每一行。您/真的/确定您的数据模型允许重复行吗?如果是,你确定这符合你的业务需求吗?有没有其他更好的方法来解决你试图解决的问题。

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

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

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

包括实际执行计划

选项,位于"查询"菜单选项下。

然后你会得到一个关于如何优化查询的信息宝库。它甚至会为您提供它认为需要添加的实际索引创建脚本。

祝你好运。我相信你可以把这个查询缩短到几分钟。

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

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

尝试对一些列进行索引,然后检查计划器试图做什么,看看是否应该更改索引内容-单列或多列索引、主键等

相关内容

  • 没有找到相关文章

最新更新