2011-07-07 5 views
5

私は一度にいくつかのカラムを追加したり削除したりする必要のあるテスト環境で使用されているpostgresデータベースにテーブルを持っています。問題は、postgresに最大1600の列があり、この数には削除された列が含まれていることです。私のテーブルには決して1600個の `ドロップされていない 'カラムはありませんが、時間がたつにつれて1600以上のドロップで蓄積されます。ドロップされたカラムのpostgresの知識をクリアする

私はVACUUMVACUUM FULLを使用して試してみた、と私は、それ自身、すべての列をスキャンして、ドロップされた列のメモリをクリーンアップするためにはpostgresを引き起こすタイプ(ALTER TABLE table ALTER COLUMN anycol TYPE anytype)が、のどれも既存の列を作り直す試してみましたこれらはpostgresの `` column number ''をリセットします。

これはテーブル全体をコピーすることで解決できますが、それ自体の問題があり、別の問題です。

postgresは列が削除されたことを忘れてしまいます。

私は、postgresがこのようなアプリケーション用に設計されていないことを知っていますが、私たちがなぜこのように実装するのかについては分かりません。使用する別のツールがある場合は、それについて聞きたいと思うかもしれませんが、まだ解決策を探していたいと思います。

+0

あなたはテーブル上で 'VACUUM'を試したと言いました。 'VACUUM FULL'はどうですか?あるいは、 'ALTER TABLE table ALTER COLUMN anycol TYPE anytype;'は、既に持っているのと同じ型に列を変更します。 –

+0

すでに分かっているように、少なくとも2つの方法があります1):CREATE TABLE new AS select * FROM the_table;物事の名前を変更する。それ以外のものはpg_dump-t thetableです。テーブルをドロップします。 pg_dumpの結果からテーブルを作り直してください。どちらの場合も、FK制約を再構築する必要があります(2番目のケースでは少し簡単です)。 – joop

答えて

5

テーブルを再作成する以外には、これは既にわかっているので、これは不可能です。

それ以外の場合は、削除された列で使用されているストレージがどこからでも消去されたときに、データベースシステムが何らかの形でトラックを保持してから属性の番号を変更する必要があります。それは信じられないほど高価で複雑になります。

+0

これは知っておきたいことです。今私はちょうど[効率的にテーブルをコピーする]を把握する必要があります(http://stackoverflow.com/questions/6601978/completely-copying-a-postgres-table-with-sql) – Erik

+2

私には、これはVACUUM FULL(ANALYZE?を含む)のジョブは、とにかくテーブルを書き換え、テーブルロックも必要です。 pg_classの更新は、他のすべての作業と比較して高すぎるとは限りません。 –

0

システムテーブルpg_attributeには古い(削除された)列が表示されます。なぜかわからないけど、それは私のバグのように見えます。

SELECT 
    relnatts, 
    attname, 
    attisdropped 
FROM 
    pg_class 
    JOIN pg_attribute att ON attrelid = pg_class.oid 
WHERE 
    relname = 'your_table_name'; 

あなたは[email protected]http://www.postgresql.org/support/submitbugし、簡単な例を含め、バグレポートを送ってもらえますか?

+0

メモリが機能する場合、実際にはトランザクション対応のalter table文のために存在します。しかし、ええ、それは最終的に行をドロップする必要があります。 :-) –

+1

いいえ、これはバグではありません。 –

関連する問題