小编Ann*_*nna的帖子

更新以前工作过的大表,现在需要几个小时

背景:我正在使用非生产 SQL Server 来操作大型数据集并运行一些基本计算。我拥有的原始数据文件大约有 30M 行,缺少记录(不是 NULL;它们不存在,但由于超出我判断的原因,它们必须存在)。所以我基本上为所有应该在那里的行和列(总共 6 列)创建了一个“shell”表——这个表大约有 80M 行。

问题:我需要帮助的步骤是在 80M 行表的顶部覆盖原始 30M 行。(所有30M行根据三列的值在大表中都有匹配的记录,其余三列当前为空,需要用原始数据覆盖。)

我成功地为更大的数据集(40M/100M 表)完成了这个过程,这个过程大约需要 4 个小时。没关系 - 这是一次性的事情。但是当我在这个较小的数据集上运行它时,它运行了 10 多个小时。我第一次遇到超时错误。我试过调整一些东西并再运行两次,但我在大约 10 个小时后取消了查询,认为我可以尝试其他的东西。

关于为什么它第一次在更大的桌子上工作,而不是在这个较小的桌子上有什么想法?关于如何使代码更高效或清除某个文件中的某些内容的任何想法?

代码:

update [shelltable]
set shelltable.column4 = originaltable.column4, 
    shelltable.column5 = originaltable.column5, 
    shelltable.column6 = originaltable.column6
from shelltable left join original table
  on shelltable.column1 = originaltable.column1 and
     shelltable.column2 = originaltable.column2 and
     shelltable.column3 = originaltable.column3;
Run Code Online (Sandbox Code Playgroud)

自从尝试失败以来我尝试过的事情:

  • 重新启动 SQL Server 实例,以便清除 tembdb
  • 重新启动电脑
  • 将 SET 子句中的列数减少到 1(我会为每列 4-6 重新运行)
  • 更新两个表的统计信息
  • Ran DB Tuning Engine,它在更大的表上推荐并创建了一个索引
  • 添加了“WHERE originaltable.column4 is not …

performance sql-server update query-performance

5
推荐指数
1
解决办法
346
查看次数