データウェアハウスを毎週更新しています。
TRUNCATE source_table1
COPY source_table1 FROM [...]
...データのインポートと:
DROP TABLE IF EXISTS my_table
CREATE TABLE my_table AS SELECT [...]
テーブルの更新用。
ドキュメントが示唆するように、タプルのかなりのシェアが更新または削除された場合、VACUUM
を実行する必要があるため、更新プロセスはVACUUM FULL [VERBOSE] ANALYZE
で終了します。ここでは、すべてのテーブルで100%のシェアであるため、VACUUM
を適用する必要があると合理的に考えました。
Verboseオプションの出力を見ると、すべてのテーブルVACUUM
edから次のように、Postgresqlが行うことはあまりないようです。
INFO: vacuuming "public.table345"
INFO: "table345": found 0 removable, 9831703 nonremovable row versions in 62538 pages
DETAIL : 0 dead row versions cannot be removed yet.
逆にANALYZE
は内部統計を更新するのに役立つ以上のものだと思います。ほとんどのテーブルのサイズは10〜100m行です。
しかし、その場合、本当にVACUUM FULL
またはVACUUM
が本当に必要なのでしょうか。
(または、更新プロセス全体(DROP/CREATE TABLE AS)が正しい方法ではない可能性がありますか?)
WALレベルに応じて、WALがスキップされるため、TRUNCATE
とCOPY
を同じトランザクションでラップすることが速くなる可能性があります。 。さらに、CTASは常にほとんどのWALをスキップします。
最小限のレベルでは、一部の一括操作のWALロギングを安全にスキップできるため、これらの操作を大幅に高速化できます(セクション14.4.7を参照)。この最適化を適用できる操作には、 source が含まれます
- CREATE TABLE AS
- インデックスを作成
- 集まる
- 同じトランザクションで作成または切り捨てられたテーブルへのコピー
BEGIN;
TRUNCATE source_table1
COPY source_table1 FROM [...]
COMMIT;
VACUUM FULL
の発行新しいテーブルでVACUUM FULL
を実行する必要はありません。これらのトランザクションではテーブルがすでに新しいため、FULL
のようにテーブルを書き換える必要はありません。 VACUUMが作用する移動可能な行がないため、VACUUM
する必要もありません。 VACUUM FULL VERBOSE
を実行すると、削除できるものがなく、デッド行が削除されていないことがわかります。 VACUUM FULL
は次の場合に役立ちます
INSERTS
をステージングし、それらをバッチでダーティテーブルに追加しています。その後、プロセスの最後に成果を上げることができます。UPDATE
は新しい行を生成するため、UPDATE
を大きなバッチで実行しています。古い行を後でデッドとしてマークするようにVACUUM
に強制するためです。単純なANALYZE
で問題なく動作します。これにより、テーブルのstatisticsが更新されます。