我在存储过程中有以下查询:
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
只要您试图匹配的字段是相同的数据类型,索引将大大缩短查询时间。
尝试对一些列进行索引,然后检查计划器试图做什么,看看是否应该更改索引内容-单列或多列索引、主键等