したがって、大きなデータセットを含むテーブルがあり、このテーブルには削除したい3つの列があります。
問題は、Postgresがどのように対処するかということです。
すべてのエントリをウォークスルーしますか、それともオーバーヘッドなしでマッピング情報を更新するだけですか? ALTER TABLE
を作成することはできますか、それともこの特定の場合にスワップテーブルを使用する必要がありますか?
また、違いが生じる場合は、3つの列すべての長さが固定されています(2つの整数と1つの数値)。
すでに質問されている場合は申し訳ありませんが、Googleは関連する質問/記事を見つけることができませんでした...
ALTER TABLE DROP COLUMNは、システムテーブルの列のみを無効にします。非常に高速ですが、ヒープファイルからデータを削除することはありません。割り当てられたファイルスペースを圧縮するには、後でVACUUMFULLを実行する必要があります。したがって、ALTER TABLE DROPCOLUMNは非常に高速です。そして、あなたはファイルを圧縮するでしょう、あなたはより遅い(排他的なロックで)VACUUMFULLを呼び出さなければなりません。
グーグルはこの質問には役に立たないかもしれませんが マニュアルが失敗することはめったにありません :
DROP COLUMN
formは列を物理的に削除しませんが、SQL操作からは見えないようにします。後続のテーブルの挿入および更新操作では、列にnull値が格納されます。したがって、列の削除は迅速ですが、削除された列が占めるスペースが再利用されないため、テーブルのディスク上のサイズがすぐに減少することはありません。スペースは、既存の行が更新されると、時間の経過とともに再利用されます。
そして:
テーブルの即時書き換えを強制するには、VACUUM FULL、CLUSTER、または書き換えを強制するALTERTABLEの形式の1つを使用できます。これにより、テーブルに意味的に見える変更はありませんが、役に立たなくなったデータは削除されます。
具体的には、システムカタログテーブルの列attisdropped
pg_attribute
はTRUE
に設定されます。