我在存储过程中有以下查询:
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个多小时。
添加索引可以改善多大程度?
还有其他想法如何改进吗?
谢谢,
伊兰
答案 0 :(得分:1)
正如David所说,在连接列上添加索引将改善此查询的响应时间。但是,这并没有解决为什么这些表没有主键的根本问题。主键唯一标识表中的每一行。您/确实/确定您的数据模型允许重复行吗?如果是这样,您确定符合您的业务需求吗?是否有另一种,或许更好的方式来解决你试图解决的问题。
要考虑的规则: 1 - 每行唯一可识别(主键) 2 - 行中的每一列都与主键相关 3 - 每列仅对主键
您可能需要将这些表分成多个表。仔细考虑每个表尝试描述的内容以及与其他表的关系。不要试图让任何一个表做超过其主键允许的表。
答案 1 :(得分:0)
优化查询时,我总是先使用
开始SSMS中的包括实际执行计划
选项,位于“查询”菜单选项下。
然后,您将获得有关如何优化查询的信息。它甚至会为您提供它认为您需要添加的实际索引创建脚本。
祝你好运。我确定您可以将此查询降低到几分钟。
答案 2 :(得分:0)
通过添加一些索引可以大大改善您的数据库。在您提供的查询中,您有一些联接可以从索引的关联列中受益。 即sd.Proj_Code = tas.StoProjCode和sd.OrderNbr = tas.StoOrderNbr和sd.FileNbr = tas.StoFile
只要您尝试匹配的字段是相同的数据类型,索引就会大大缩短您的查询时间。
尝试索引某些列,然后检查规划器尝试执行的操作,以查看是否应更改索引内容 - 单个或多个列索引,主键等