我需要每天更新一个非常大的(300M 记录)和广泛的 TABLE1
.更新的源数据位于另一个表 UTABLE
中。即 TABLE1
行的 10%-25%但很窄。两个表都有 record_id
作为主键。
目前,我正在重新创建 TABLE1
使用以下方法:
<!-- language: sql -->
1) SELECT (required columns) INTO TMP_TABLE1
FROM TABLE1 T join UTABLE U on T.record_id=U.record_id
2) DROP TABLE TABLE1
3) sp_rename 'TMP_TABLE1', 'TABLE1'
但是,这在我的服务器上需要将近 40 分钟(SQL Server 的 RAM 为 60GB)。我想实现 50% 的性能提升 - 我可以尝试哪些其他选项?
MERGE
和 UPDATE
- 类似下面的代码仅适用于很小的 UTABLE
的速度更快 table - 在全尺寸下,一切都悬而未决:<!-- language: SQL -->
MERGE TABLE1 as target
USING UTABLE as source
ON target.record_id = source.record_id
WHEN MATCHED THEN
UPDATE SET Target.columns=source.columns
最佳答案
实际上,我已经找到了针对此类查询的一般建议:使用 SQL Merge 或 Update 的想法非常聪明,但是当我们需要更新大量记录(即 75M )时它会失败表(即 240M )。
看下面查询的查询计划我们可以说TABLE SCAN
TABLE1 和最后的 MERGE
正在占用 90% 的时间。
MERGE TABLE1 as Target
USING UTABLE as source
ON Target.record_id = source.record_id
WHEN MATCHED AND (condition) THEN
UPDATE SET Target.columns=source.columns
因此,为了使用 MERGE,我们需要:
UTABLE
来完成。更小或指定附加 condition
这缩小了要合并的部分。 TABLE1
减少两倍将我的实际查询时间从 11 小时减少到 40 分钟。 正如马克提到的,你可以使用
UPDATE
语法和使用 WHERE
子句缩小要合并的部分 - 这将产生相同的结果。另外请避免索引 TABLE1
因为这将导致在 MERGE
期间重建索引的额外工作
关于sql-server-2008 - SQL Server 中非常大的表的更新或合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6001980/