web-dev-qa-db-ja.com

大規模なデータセットでPostgresの列を削除する

したがって、大きなデータセットを含むテーブルがあり、このテーブルには削除したい3つの列があります。
問題は、Postgresがどのように対処するかということです。

すべてのエントリをウォークスルーしますか、それともオーバーヘッドなしでマッピング情報を更新するだけですか? ALTER TABLEを作成することはできますか、それともこの特定の場合にスワップテーブルを使用する必要がありますか?

また、違いが生じる場合は、3つの列すべての長さが固定されています(2つの整数と1つの数値)。

すでに質問されている場合は申し訳ありませんが、Googleは関連する質問/記事を見つけることができませんでした...

26
nikita2206

ALTER TABLE DROP COLUMNは、システムテーブルの列のみを無効にします。非常に高速ですが、ヒープファイルからデータを削除することはありません。割り当てられたファイルスペースを圧縮するには、後でVACUUMFULLを実行する必要があります。したがって、ALTER TABLE DROPCOLUMNは非常に高速です。そして、あなたはファイルを圧縮するでしょう、あなたはより遅い(排他的なロックで)VACUUMFULLを呼び出さなければなりません。

33
Pavel Stehule

グーグルはこの質問には役に立たないかもしれませんが マニュアルが失敗することはめったにありません

DROP COLUMN formは列を物理的に削除しませんが、SQL操作からは見えないようにします。後続のテーブルの挿入および更新操作では、列にnull値が格納されます。したがって、列の削除は迅速ですが、削除された列が占めるスペースが再利用されないため、テーブルのディスク上のサイズがすぐに減少することはありません。スペースは、既存の行が更新されると、時間の経過とともに再利用されます。

そして:

テーブルの即時書き換えを強制するには、VACUUM FULL、CLUSTER、または書き換えを強制するALTERTABLEの形式の1つを使用できます。これにより、テーブルに意味的に見える変更はありませんが、役に立たなくなったデータは削除されます。

具体的には、システムカタログテーブルの列attisdroppedpg_attributeTRUEに設定されます。

32