0

大きなDBテーブルからアーカイブテーブルに行を挿入してから、挿入された行を削除しています。私のコードは次のとおりです。

-- 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 UNCLUSTEREDSRC_DB.dbo.ORIG_TABLEのORDER_ID列にインデックスがあります

私の問題は、ストアドプロシージャを試してみると、このテーブルの処理が停止しているように見えることです。

私は最も効率的な解決策がない可能性があることを理解しており、ストアドプロシージャを改善する方法についての批判や提案を聞きたいと思います。

ありがとう

4

2 に答える 2

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 に答える
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 に答える