0

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

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个多小时。

添加索引可以提高多大的效率?

任何其他想法如何改进它?

谢谢,

宜兰

4

3 回答 3

1

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

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

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

于 2015-02-11T22:00:02.077 回答
0

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

包括实际执行计划

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

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

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

于 2015-02-11T21:40:51.793 回答
0

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

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

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

于 2015-02-11T21:41:40.590 回答