12

大規模なデータセットを持つテーブルがあり、このテーブルには削除したい3つのカラムがあります。
質問があります:Postgresはどのように対処しますか?大規模なデータセットでPostgresの列を削除する

すべてのエントリを調べたり、オーバーヘッドをかけずにマッピング情報を更新しますか? ALTER TABLEを作成することはできますか?またはこの特定のケースでスワップテーブルを使用する必要がありますか?

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

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

答えて

20

ALTER TABLE DROP列は、単にシステムテーブルのみの列を無効ありません。非常に高速ですが、ヒープファイルからデータを削除することはありません。割り当てられたファイル領域をコンパクトにするには、あとでVACUUM FULLを実行する必要があります。 ALTER TABLE DROP COLUMNは非常に高速です。コンパクトなファイルにするには、低速(専用LOCK付き)のVACUUM FULLを呼び出す必要があります。

16

Googleはこの質問のために役に立たないかもしれないが、the manual rarely fails

DROP COLUMNフォームが物理的に列を削除しませんが、 は、単にSQL操作にそれが見えなくなります。表の後続の挿入操作および 更新操作では、その列にヌル値が保管されます。 したがって、カラムを削除することは迅速ですが、ドロップされた カラムが占有していたスペースが再利用されないため、即座にテーブルのディスク上のサイズが に減少することはありません。空白は、 の既存の行が更新されるため、時間の経過とともに再利用されます。

そして:

テーブルの即時の書き換えを強制するには、あなたはVACUUM FULL、 CLUSTERまたは書き換えを強制するALTER TABLEの形式のいずれかを使用することができます。この は、テーブルに意味的に見える変化をもたらさないが、有用ではないデータを取り除く を得る。

具体的には、システムカタログ表pg_attributeの列attisdroppedTRUEに設定されています。

+2

興味深いことに、行の更新によって、削除された列にNULLが「格納」されるようになるためです。 postgresqlはオプションの "ヌルビットマップ"にビットを設定することによってヌルを格納するため、_every_ローは、表示されているローがない場合でもnullビットマップ(ドロップされた8個のカラムまたはドロップされていないカラムごとに1バイトのサイズ)ヌル –

関連する問題