效率有助于从大型DB表中插入和删除行~100M行

时间:2012-09-19 16:43:22

标签: tsql sybase

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

-- 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个索引

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

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

由于

2 个答案:

答案 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