我将大型数据库表中的行插入到存档表中,然后删除插入的行。我的代码如下:
-- 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行,临时表将在循环中填充和清除,这意味着它将用于每次循环迭代中的插入和删除操作。 / p>
我的SRC_DB.dbo.ORIG_TABLE的ORDER_ID列上有UNIQUE UNCLUSTERED
个索引
我的问题是当我尝试我的存储过程时,它似乎停止处理此表。
我知道我可能没有最有效的解决方案,并希望听到有关如何改进存储过程的批评和建议。
由于
答案 0 :(得分: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)
答案 1 :(得分: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