2017-11-20 13 views
0

私はかなり大きなテーブルを持っています。削除が適切にカスケードされていなかった以前のバグのために、多くの項目が参照されなくなりました。Postgres:チャンクの巨大なテーブルの参照されていないエントリを削除する

ID_DOES_NOT_EXIST_IN_OTHER_TABLEが永遠に実行されていて、週末にすべて走ってしまい、やり遂げられず、最終的にそれを強制終了しなければならない単純な削除を試みています。しかし、ここには緊急性はありませんので、これを増分で行う方法を探したいと思います。 Postgres DELETEでは、制限の使用を許可していないようです。

一度に100000(任意の数値を選ぶ)の行を削除してゆっくりとテーブルの中を歩き回り、それをクリーンアップする方法はありますか?

答えて

1

うまくいけば、あなたは良いインデックスを持っているとうまくいけば、これが役に立ちます。 CTEを使用して、削除するIDのサブセットをマークしてみてください。

 WITH marked_ids as (
    SELECT my_table.id 
     FROM other_table 
    RIGHT 
    OUTER 
     JOIN my_table 
    ON other_table.id = my_table.fk_id 
    WHERE other_table.id IS NULL 
    LIMIT 1000 
) 
DELETE 
    FROM my_table 
WHERE id IN (SELECT id FROM marked_ids); 
関連する問題