Ann*_*nna 5 performance sql-server update query-performance
背景:我正在使用非生产 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)
自从尝试失败以来我尝试过的事情:
经过这些调整后,最新的尝试仍在运行,目前为 9.5 小时。感谢您的提示和见解!
如果您列出了拥有的索引或查询计划,这可能会有很大帮助。如果对第 4、5 或 6 列建立索引,则可能会减慢该过程,而在第 1、2 和 3 列上建立聚集索引应该会加快该过程。
如果第 4,5 或 6 列是可变长度(例如 varchar),则更新新值可能会导致大量页面拆分,这肯定会使其变慢。
我认为 John M 的意思是,如果例如第 1 列中有合理数量的不同值,您可以首先将不同值收集到临时值中。表,然后对每个值单独运行更新,因为以较小的部分连接表通常会快得多。
当然,一切都取决于几个因素,例如数据类型、第 1-3 列中不同值的数量等。
归档时间: |
|
查看次数: |
346 次 |
最近记录: |