【发布时间】:2018-01-20 08:13:12
【问题描述】:
我们在 SQL Server 中使用完全恢复模式。我们有一个从临时表合并到最终表的工作。临时表包含数百万行。决赛桌也很大,有数百万行。我们分批合并 10,000 行。
下面给出单个批次的伪代码:
BEGIN TRANSACTION
DELETE TOP 10000 *
FROM <Staging Table>
OUTPUT deleted.* INTO @TableVariable
MERGE INTO <Final Table>
USING @TableVariable
COMMIT TRANSACTION
问题是,对于每个新批次,批次操作都会变慢。当我们重新启动服务器时,批处理再次变得更快。事务也没有写入磁盘,并且需要很长时间才能插入磁盘。我们怀疑这是事务日志的问题。当我们减小批处理大小时,会发生更多事务,并且批处理速度会更慢。
有没有办法提高这种批量删除和合并操作的性能?您是否建议使用CHECKPOINT 强制进入完全恢复模式?
【问题讨论】:
-
只是一个想法;将“巨大”表连接到表变量可能不是最佳途径,因为它总是会将表变量视为包含 1 行。
-
我明白了。当我们进行批处理时,我们在表变量中每 10,000 行加载一次,并将其用于合并。这是第一次,随着每个批次的进展,它的速度越来越快。我的问题是如何避免未来批次的减速。
标签: sql-server performance transactions transaction-log recoverymodel