sql - SQL Server:合并迭代
问题描述
我必须将数百万行合并到一个表中。目标表有一个 AFTER UPDATE 触发器。整个过程消耗的内存比我想分配的要多得多,并且 tempdb 正在占用磁盘空间。
我想让 MERGE 命令一次分批运行 100,000 条记录。随着 SET ROWCOUNT 被弃用并且游标效率低下,我不确定最好的方法是什么。
解决方案
面向集合的方法将是有效运行查询的最佳方式。所以你所做的对我来说似乎很好。如果它消耗临时数据库等,则需要知道您是否正在执行任何正在减慢的逐行操作。通常,MERGE 是单个语句,因此是有效的。
要考虑的另一件事是,如果您在目标表上有索引,那么您可以删除这些索引,然后运行 MERGE,然后重新创建索引。
谈到您的问题,您可以通过使用 mod 运算符并在循环中运行 MERGE 来拆分成批次
例如:
declare @i int
select @i=count(*)/10 from source
while @i>0
begin
merge
into dest d
using (select *
from source
where id%10000=i --here id is the primary key of the source table
) s
on d.id=s.id
when matched
set ...
when not matched
insert...
...rest of the insert/update logic here
set @i=@i-1
end
推荐阅读
- pdf - 如何以 Xamarin 形式创建 pdf 并将内容呈现为表格
- wireshark - 注册 MCCGQ12LM(Aqara 门窗传感器 T1)
- angular - 如何在 Angular 11 中扩展 Renderer2?
- html - 防止 CSS 网格内容流出边界,而是换行到新行
- python - Alexa使用python获取用户电子邮件
- javascript - HTML5 在锚点中使用 Javascript 的正确方法是什么?
- python - 有没有办法一次将多个元素插入到 ndarray 中的不同位置?
- node.js - 如何在可视代码中编写 package.json 文件?
- java - 如何摆脱“使用 timeoutMillis = ... 关闭 Kafka 生产者”
- mysql - Sequelize 从 case when condition 获得不同的值