首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超大型进口超过24小时

超大型进口超过24小时
EN

Database Administration用户
提问于 2019-05-31 16:53:11
回答 1查看 58关注 0票数 1

我们有一个查询,我们运行这个查询来导入一个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,它们位于旋转驱动器上。

你认为我们能做些什么来提高这个过程的效率?

如有任何信息,将不胜感激!谢谢!

EN

回答 1

Database Administration用户

发布于 2019-06-03 22:56:43

我看到的第一个问题是,您正在一次运行中执行大规模更新(持续时间为19+hours),这就是服务器资源不足的原因。您需要批量执行更新。它们会更快,并且您的服务器设置应该能够处理资源负载。

尝试以下几点:

代码语言:javascript
复制
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部分的流程:

  1. 对主表执行批处理更新。
  2. 将数据插入时态或阶段空表
  3. 将数据从舞台表插入到主表

在实现这一功能之后,您应该能够获得更好的性能。分享你的成果。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/239578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档