インデックス付き日付フィールドに基づいて、13億行のテーブルから約4億行を削除する必要があります。
テーブルのサイズは約800 GBです。
悪影響を与えずにデータを削除する最も効率的な方法は何ですか?テーブルは頻繁に使用されます。つまり、多くの挿入と更新が行われます(削除される行には影響しません)。
最も速いメンテナンスウィンドウがありますが、十分に大きなメンテナンスウィンドウを取得できない場合があります。反対に、私は削除に時間をかけることができるので、ラッシュはありません。
これを行うためのより良い方法を考え出した
Insert into new_tbl select * from old_tbl where start_date < now -INTERVAL '2 years'
ダウンタイムウィンドウ中:
insert into new_tbl select * from old_tbl where id not in (select id from new_tbl ) and id not in ( select id from old_tbl)
名前の変更old_tbl
からold_tbl_drop
およびnew_tbl
からold_tbl
。
old_tbl_drop
。たとえば、10.000の削除とコミットを実行し、次の10,000を実行するバッチスクリプトを自分で作成します。
削除してすぐにコミットできる数を選択する必要があります。そうすることで、他のプロセスにあまり長く干渉しなくても、物事を動かし続ける価値があります。
削除するレコードをタイムリーに見つけることができると仮定します。
1.2 Bのテーブルから400 Mを削除する必要がある場合。つまり、デッド400 M行をマークする必要があります。それはそれを3回書き直すよりもかなり速いです。したがって、PostgreSQLで最も効率的な方法はシンプルです。
DELETE FROM foo WHERE ...
ところで、10億行の多くの行を削除しても、実際には大したことではありません。試してください。
\timings
CREATE TABLE foo
AS
SELECT x::bigint
FROM generate_series(1,1200000000) AS gs(x);
DELETE FROM foo
WHERE x < 400000000;
こちらもご覧ください