我需要执行非常大(300M记录)和广泛TABLE1
的每日更新。更新的源数据位于另一个表UTABLE
中,即TABLE1
行的10%-25%,但较窄。这两个表都有record_id
作为主键。SQL Server中非常大的表的更新或合并
目前,我使用下面的方法重建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'
但是这需要我的服务器(的RAM为SQL Server 60GB)在将近40分钟。我想实现50%的性能提升 - 我可以尝试其他选择吗?
MERGE
和UPDATE
- 类似下面的代码更快只有一个非常小的UTABLE
表的工作 - 在全尺寸,一切都只是挂起:<!-- 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
听说我可以执行批MERGE通过使用ROWCOUNT - 但我不认为它可以足够快的300M行表。
任何SQL查询提示,可以帮助吗?
期间重建索引的额外工作您可以发布查询计划吗? – 2011-05-16 08:54:04
嗨@chris,查询计划很简单:** 1 **表扫描TABLE1,** 2 **表扫描UTABLE,** 3 HASH JOIN,** 4 MERGE。第一步和最后一步占用了90%的时间。不过,我已经理解如何解决我的问题 - 请看我自己的答案。 – 2011-05-17 09:59:55