【发布时间】:2015-02-11 21:31:08
【问题描述】:
我在存储过程中有以下查询:
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个多小时。
添加索引能提高多少?
还有什么改进的方法吗?
谢谢,
宜兰
【问题讨论】:
-
哎呀!!!没有聚集索引的表称为堆。你有几个相当大的。如果不对您的表进行一些结构更改,则几乎没有机会提高性能。您需要一个主键,然后您需要添加一些索引。没有更多细节,很难知道这些可能是什么。
-
第一笔交易是更新统计信息 - 索引
-
我注意到你在连接中使用了来自链接服务器的表。不是一个好主意(恕我直言)。如果你使用 SQL Server 2008+ - 尝试使用交叉应用
-
正如 DimaSUN 提到的,性能问题很可能是您的链接服务器,因为您缺少索引。发现自己处于这种情况(使用链接服务器,没有索引)并不是一个好的迹象。
标签: sql sql-server database-performance query-performance qsqlquery