0

我将大型数据库表中的行插入存档表,然后删除插入的行。我的代码如下:

-- insert here
insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
where SRC_DB.dbo.ORIG_TABLE.ORDER_ID
IN ( select #tmp_table.order_id from #tmp_table )

-- delete here
delete from SRC_DB.dbo.ORIG_TABLE
where SRC_DB.dbo.ORIG_TABLE.ORDER_ID
IN ( select #tmp_table.order_id from #tmp_table )

表的大小#tmp_table.order_id当前设置为 10K 行,临时表将在循环中被填充和清除,这意味着它将用于我在每次循环迭代中的插入和删除操作。

UNIQUE UNCLUSTERED我的 SRC_DB.dbo.ORIG_TABLE 的 ORDER_ID 列上有索引

我的问题是当我尝试我的存储过程时,它似乎在处理这个表时停止了。

我知道我可能没有最有效的解决方案,并希望听到有关如何改进我的存储过程的批评和建议。

谢谢

4

2 回答 2

1

我会在 #tmp_table 上尝试 PK 并减少倒计时

insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
join #tmp_table on #tmp_table.order_id = SRC_DB.dbo.ORIG_TABLE.order_id 
order by clustered index on DEST_DB.dbo.ARCHIVE_TABLE

delete SRC_DB.dbo.ORIG_TABLE 
join #tmp_table on #tmp_table.order_id = SRC_DB.dbo.ORIG_TABLE.order_id
于 2012-09-19T17:33:37.233 回答
1

存储过程正在执行你提供的代码?

这是否“它似乎只是停止处理这张表”你从未见过这个 SP 完成 - 这么慢?

尝试更小的 #tmp_table.order_id - 100 或 1000 行。

尝试像这样更改 WHERE 子句:

-- insert here
insert into DEST_DB.dbo.ARCHIVE_TABLE
select SRC_DB.dbo.ORIG_TABLE.*
from SRC_DB.dbo.ORIG_TABLE
where exists
( select #tmp_table.order_id from #tmp_table where #tmp_table.order_id=SRC_DB.dbo.ORIG_TABLE.ORDER_ID)

-- delete here
delete from SRC_DB.dbo.ORIG_TABLE
where exists 
( select #tmp_table.order_id from #tmp_table where SRC_DB.dbo.ORIG_TABLE.ORDER_ID=#tmp_table.order_id)
于 2012-09-19T17:00:55.153 回答