我们有一个查询,我们运行这个查询来导入一个Master到我们的数据库中,其中有大约2亿条记录。
我们首先用过期日期标记数据库表中的现有数字。这个过程需要大约19小时或更长时间,并消耗掉日志文件和tempdb日志文件。
查询的第二部分是从位于c:驱动器上的文本文件导入。这个部分也花了相当长的时间,最后一次Studio崩溃了,所以查询失败了,没有完成。
下面是我们运行的查询:

给出一些服务器设置的背景: Windows 2016标准intel xeon 8 8cores 2.59ghz 128 To ram sql 2016标准
数据卷位于3par 8200 SAN旋转驱动器上。
位于3par 8200 SAN旋转驱动器上的日志卷(现在的大小是1.46tb,因为我们已经用完了3次空间)
Temdb数据和日志卷也位于3 3par上。(一卷)
是否有更好的方法来运行此查询并使其更高效?我们是否应该创建一个包含两个步骤的作业--一个用于更新到期,另一个用于bluk insert?如果我们将数据和日志卷移动到3par...currently上的SSD,它们位于旋转驱动器上。
你认为我们能做些什么来提高这个过程的效率?
如有任何信息,将不胜感激!谢谢!
发布于 2019-06-03 22:56:43
我看到的第一个问题是,您正在一次运行中执行大规模更新(持续时间为19+hours),这就是服务器资源不足的原因。您需要批量执行更新。它们会更快,并且您的服务器设置应该能够处理资源负载。
尝试以下几点:
DECLARE @Rows INT,
@BatchSize INT;
SET @BatchSize = 2000;
SET @Rows = @BatchSize;
WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP (@BatchSize) tab
SET tab.expiration = dateadd(day, 5, getdate())
FROM I3dialer.dbo.MasterDNC tab
WHERE tab.expiration < dateadd(day, 5, getdate());
SET @Rows = @@ROWCOUNT;
END;在测试之前,请确保过期字段中有一个索引来加速查询。
对于问题的第二部分,除了增加批处理插入量外,10000应该会有所帮助。您实际上可以对此进行实验,以找到最佳的批处理大小,例如,对100万条记录进行测试,以确定是否存在性能差异。还有其他事情要考虑。您应该首先将数据加载到空表中,执行清理数据所需的任何操作,最后将它们插入主表中。
总之,现在您应该有一个3部分的流程:
在实现这一功能之后,您应该能够获得更好的性能。分享你的成果。
https://dba.stackexchange.com/questions/239578
复制相似问题