さまざまなサイズの6つのテーブルの1つから数万行を削除する必要があるプロジェクトがありますが、それらの間に約3,000万行があります。与えられたデータの構造のため、6つのテーブルのどれに削除する必要のある行があるのかわからないため、すべてのテーブルに対してすべての削除を実行する必要があります。ID列に対してINDEXを作成して速度を上げようとしましたが、速度が上がる場合は削除できます。
私の問題は、実際に削除を実行する効率的な方法が見つからないように見えることです。テストの目的で、約9400行の単一のテストテーブルに対して7384の削除行を実行しています。Oracle SQL Developerで、考えられるいくつかのクエリソリューションをテストしました。
7384個の個別のDELETE
ステートメントは203秒かかりました。
delete from TABLE1 where ID=1000001356443294;
delete from TABLE1 where ID=1000001356443296;
etc...
7384の個別のSELECT
ステートメントには57秒かかりました。
select ID from TABLE1 where ID=1000001356443294
select ID from TABLE1 where ID=1000001356443296
etc...
7384個の個別のDELETE from (SELECT)
ステートメントは214秒かかりました。
delete from (select ID from TABLE1 where ID=1000001356443294);
delete from (select ID from TABLE1 where ID=1000001356443296);
etc...
127.4秒かかった場所に7384句がある1つのSELECT
ステートメント:OR
select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...
74.4秒かかった場所に7384句がある1つのDELETE from (SELECT)
ステートメント:OR
delete from (select ID from TABLE1 where ID=1000001356443294 or ID = 1000001356443296 or ...)
最後のものが最速かもしれませんが、さらにテストすると、9000行のテーブルから200,000行のテーブル(最終的なテーブルセットサイズの1%未満)にスケールアップすると、同じステートメントに14分かかります。走る。行ごとに50%以上高速ですが、完全なデータセットに対して実行すると、最大で約1日を推定します。私は、このタスクを実行するために使用したソフトウェアが約20分でそれを実行できることを正当に認めています。
だから私の質問は:
- 削除するより良い方法はありますか?
- 一連の
SELECT
ステートメント(つまり、2番目のテストなど)を使用して、特定の行がどのテーブルにあるかを検出し、削除クエリを実行する必要がありますか?それでもかなり遅いように見えますが...- 削除を高速化するために他にできることはありますか?DBAレベルのアクセス権や知識がありません。