web-dev-qa-db-ja.com

Postgresqlテーブルのテーブルスペースを変更すると、「vacuumfull」や「cluster」のように圧縮されますか?

他のテーブルに使用するには、Postgresql9.3.2データベースのテーブルのディスク領域を再利用する必要があります。これを実現するための標準的な提案は、「VACUUM FULL」または「CLUSTER」、または内容をフラットファイルにコピーしてコピーし直すことです。「ALTERTABLE」コマンドを使用して既存のテーブルを新しいテーブルスペースに移動する場合、テーブルの内容コピーされます。 「ALTERTABLE」プロセス中に圧縮されているかどうか誰かに教えてもらえますか?

3
sevzas

これまでのコメントは大まかに正しいですが、src/backend /tablecmds.cを見て信頼できる答えを与えるために:

のみ _ALTER TABLE ... SET TABLESPACE ... ;_を実行している場合、ATExecSetTableSpace()が呼び出されて_SET TABLESPACE_が処理され、copy_relation_data()を使用してテーブルのWALログに記録されたブロックごとのコピーを実行します。ただし、テーブルの書き換えが必要な追加のアクションを_ALTER TABLE_コマンドに指定する場合は、テーブルの新しいコピーをATRewriteTable()を介して新しいテーブルスペースに作成(および圧縮)する必要があります。

4

答えは、「テーブルを別のテーブルスペースに移動すると、not VACUUMFULLやCLUSTERのように圧縮されます」と思われます。

私はこれを次のようにテストしました:

  • ダミーテーブルの作成
  • 38MBの曲に100万のダミー行で埋める
  • 「DELETEfromDUMMY」ですべての行を削除する
  • 「ALTERTABLEDUMMY SET TABLESPACEoverflow;」を使用して、テーブルを別のテーブルスペースに移動します。
  • 新しい表スペースでの表の大きさを確認します。

テーブルのサイズを決定するために使用したクエリは次のとおりです。

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
  ORDER BY pg_total_relation_size(C.oid) DESC;
2
sevzas