大量のデータを削除する必要があり、Oracle DB の一時領域が不足しているため、links_data という名前のテーブルから一連のレコードを削除する際に問題に直面しています。
ストアドプロシージャに関する私の知識がほとんどないのと同じように、以下のコードを書きました。しかし、ストアド プロシージャの実行も遅いようです。
シナリオは、links_data テーブルの nm_folder 列が link_folders テーブルとの外部キー関係を持つ、links_data テーブルから行を削除する必要があるということです。link_folders テーブルの nm_folder が主キーで、一度に 10000 レコードを削除してコミットし、もう一度 10000 レコードを削除してコミットするつもりです。
このクエリの最適化を手伝ってください。ありがとうございます。それでは、お元気で、
Declare
Type ty_link_floder is table of number;
tble_id_folder ty_link_floder;
Cursor c_data is
select id_folder from link_folders where nm_folder='User Hotlist';
Begin
OPEN c_data;
LOOP
FETCH c_data
BULK COLLECT INTO tble_id_folder LIMIT 10000;
EXIT WHEN tble_id_folder.count = 0;
FORALL i IN tble_id_folder.first .. tble_id_folder.last
DELETE FROM links_data
WHERE id_folder = tble_id_folder(i);
COMMIT;
-- Process contents of collection here.
DBMS_OUTPUT.put_line(tble_id_folder.count || ' rows deleted from links_data table so far');
tble_id_folder.delete;
END LOOP;
CLOSE c_data;
Exception
When others Then
Commit;
Raise;
End;