如何提高 SQL Server 查询的性能 [关闭]
Posted
技术标签:
【中文标题】如何提高 SQL Server 查询的性能 [关闭]【英文标题】:How to improve perfomance of SQL Server query [closed] 【发布时间】: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 提到的,性能问题很可能是您的链接服务器,因为您缺少索引。发现自己处于这种情况(使用链接服务器,没有索引)并不是一个好的迹象。 【参考方案1】:正如 David 所说,在连接列上添加索引将缩短此查询的响应时间。但是,这并没有解决这些表为什么没有主键的根本问题。主键唯一标识表中的每一行。您/真的/确定您的数据模型允许重复行吗?如果是这样,您确定这符合您的业务需求吗?是否有另一种可能更好的方法来解决您要解决的问题。
要考虑的规则: 1 - 每行唯一可识别(主键) 2 - 行中的每一列都与主键相关 3 - 每列仅对主键
您可能需要将这些表拆分为多个表。仔细考虑每个表试图描述的内容以及与其他表的关系。不要试图让任何一张表做的事情超出其主键所允许的范围。
【讨论】:
【参考方案2】:在优化查询时,我总是从使用
包括实际执行计划
SSMS 中的选项,在查询菜单选项下。
然后,您将获得有关如何优化查询的大量信息。它甚至会为您提供它认为您需要添加的实际索引创建脚本。
祝你好运。我相信您可以将此查询缩短到几分钟。
【讨论】:
为什么投反对票?如果不重新创建他的数据库,就很难改进他的查询。因此,指导他使用适当的工具肯定会对他有所帮助。 我没有理由拒绝投票。这是试图帮助改进查询的唯一答案,而不仅仅是我知道我有问题的索引和 Primery Key。【参考方案3】:添加一些索引会大大改善您的数据库。在您提供的查询中,您有一些连接将受益于被索引的关联列。 IE。 sd.Proj_Code = tas.StoProjCode 和 sd.OrderNbr = tas.StoOrderNbr 和 sd.FileNbr =tas.StoFile
只要您尝试匹配的字段是相同的数据类型,索引将大大缩短您的查询时间。
尝试索引一些列,然后检查规划器正在尝试做什么,看看是否应该更改索引的内容 - 单列或多列索引、主键等
【讨论】:
以上是关于如何提高 SQL Server 查询的性能 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数