それはすべて依存しています...
関連するテーブルへの同時書き込みアクセスがない場合、またはテーブルを排他的にロックする必要がある場合、またはこのルートがまったく適していない場合があります。
すべてのインデックスを削除します (おそらく、削除自体に必要なものを除く)。
後で再作成します。これは通常、インデックスの増分更新よりもはるかに高速です。
安全に削除/一時的に無効にできるトリガーがあるかどうかを確認します。
外部キーはテーブルを参照していますか? 削除できますか? 一時的に削除?
自動バキュームの設定によっては、操作の前に実行すると役立つ場合があります。VACUUM ANALYZE
設定によっては、マニュアルのデータベースへの入力の関連する章にリストされているポイントの一部も役立つ場合があります。
テーブルの大部分を削除し、残りが RAM に収まる場合、最も速くて簡単な方法は次のとおりです。
BEGIN; -- typically faster and safer wrapped in a single transaction
SET LOCAL temp_buffers = '1000MB'; -- enough to hold the temp table
CREATE TEMP TABLE tmp AS
SELECT t.*
FROM tbl t
LEFT JOIN del_list d USING (id)
WHERE d.id IS NULL; -- copy surviving rows into temporary table
-- ORDER BY ? -- optionally order favorably while being at it
TRUNCATE tbl; -- empty table - truncate is very fast for big tables
INSERT INTO tbl
TABLE tmp; -- insert back surviving rows.
COMMIT;
この方法では、ビュー、外部キー、またはその他の依存オブジェクトを再作成する必要はありません。そして、肥大化のない元の (並べ替えられた) テーブルを取得します。
temp_buffers
マニュアルの設定についてお読みください。この方法は、テーブルがメモリに収まる限り、または少なくともそのほとんどに収まる限り高速です。トランザクション ラッパーは、この操作の途中でサーバーがクラッシュした場合にデータが失われるのを防ぎます。
VACUUM ANALYZE
後で実行します。または(通常、ルートに移動した後は必要ありません)最小サイズにします(排他ロックを取ります)。大きなテーブルの場合は、代替手段を検討してください/または同様の:TRUNCATE
VACUUM FULL ANALYZE
CLUSTER
pg_repack
小さなテーブルの場合、多くの場合、単純なDELETE
代わりのTRUNCATE
ほうが高速です。
DELETE FROM tbl t
USING del_list d
WHERE t.id = d.id;
マニュアルの注記セクションをTRUNCATE
お読みください。特に(ペドロも彼のコメントで指摘したように):
TRUNCATE
他のテーブルからの外部キー参照を持つテーブルでは、そのようなすべてのテーブルが同じコマンドで切り捨てられない限り、使用できません。[...]
と:
TRUNCATE
ON DELETE
テーブルに存在する可能性のあるトリガーは起動しません。