PostgreSQLでテーブルパーティションを削除する方法を探している人のために、ここに最新の答えがあります。
解決策は、DELETEステートメントを使用しないことです。これは、データを保持していた対応するテーブルパーティションを削除せずにデータを削除するためです。 OPは、レコードを削除するのではなく、パーティションテーブルの管理について質問したため、DELETEステートメントを使用するソリューションは、レコードを削除するという不要なデータベースオーバーヘッドを追加し、空のパーティションテーブルをそのまま残し、パーティションを使用する主な利点の1つを完全に無視します。役に立たなくなったときにテーブルを削除します。
この場合の解決策は、不要になったパーティションテーブルを削除することです。実稼働環境でこの問題を解決するためのソリューションを作成しました。答えは
OPの問題を解決するために、私が作成した関数を2つのわずかな修正で使用して、 fullTablenameを変更できます。 変数と日付形式。 fullTablename変数行は
から変更する必要がありますfullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
このようなYYYY-MM-DD_log形式に
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
次に、日付形式を
から少し変更する必要があります。WHEN partition_plan='day' THEN 'YYYYDDD'
記載されているテーブルの命名規則に準拠
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
次に、クリーンアップを実行する関数を呼び出すSQLクエリを、次のような日常のメンテナンススクリプトから呼び出すことができます。
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
5のYYYY-MM-DD_logテーブルを削除します 180より古い日 数日前。数十または数百の古いテーブルパーティションを削除する最初の実行では、 5 目的の効果を達成するために、はるかに高い値に設定できます。