2011-07-07 14 views
5

Bir defada birkaç sütun eklememiz ve düşürmemiz gereken bir test ortamında kullanılan bir postgre veritabanında bir tablo var. Sorun, postgres en fazla 1600 sütun içermesi ve bu sayının bırakılan sütunlar içermesidir. Masamın hiçbir zaman 1600 toplam 'un-dropped' sütununa sahip olmayacak, ancak zamanla 1600'den fazla düşüşle birikir.Temizle bırakılan sütunlar hakkında bilgi edinme bilgileri

Ben VACUUM ve VACUUM FULL kullanarak denedim ve ben kendi, sütunların tümünü tarayıp düştü sütunlarından hafızasını temizlemek için postgres neden türü (ALTER TABLE table ALTER COLUMN anycol TYPE anytype) ama hiçbiri olarak varolan sütun yeniden döküyor denedim bu sıfırlama sonrası '' sütun numarası ''.

Bunun, tüm tabloyu kopyalayarak çözülebileceğini biliyorum, ancak bunun kendi sorunları var ve ayrı bir sorudur.

Postgre'lerin sütunları düşürdüğünü unutturmanın bir yolu olduğunu biliyor musunuz?

Postgre'lerin böyle uygulamalar için tasarlanmadığını biliyorum, ancak neden bu şekilde uygulamaya koyduğumuzu anlamayacağım. Kullanmak için alternatif bir araç varsa, bunu duymak isterdim, ancak yine de buna bir çözüm bulmak isterim.

+0

Masada VACUUM'u denediğinizi söylediniz. VAKUM DOLU ne hakkında? Ya da belki de 'ALTER TABLE tablo ALTER COLUMN anycol TYPE anytype; ', bir sütunu halihazırda sahip olduğu türe göre değiştirerek. –

+0

Zaten öğrendiğiniz gibi en az iki yol var1): CREATE TABLE new AS select * FROM the_table; şeyleri yeniden adlandırmak; Biri pg_dump - t thetable; masayı bırak; tabloyu pg_dump sonuçlarından yeniden oluşturun. BOTH vakalarında FK kısıtlamalarını yeniden yapılandırmanız gerekecektir (bu, ikinci durumda daha basittir) – joop

cevap

5

Bu, zaten öğrendiğiniz gibi, tabloyu yeniden oluşturmak dışında mümkün değildir. Aksi halde, veritabanı sistemi, düşürülmüş bir sütun tarafından kullanılan depolama alanı her yerde temizlendiğinde ve öznitelikleri yeniden numaralandırıldığında bir şekilde takip etmek zorunda kalır. Bu inanılmaz derecede pahalı ve karmaşık olurdu.

+0

Bunu bilmek güzel. Şimdi sadece [tabloyu etkili bir şekilde nasıl kopyalayacağımı] öğrenmem gerekiyor (http://stackoverflow.com/questions/6601978/completely-copying-a-postgres-table-with-sql) – Erik

+2

Bana göre, bu bir VACUUM FULL için iş (ANALYZE dahil?), yine de tabloyu yeniden yazar ve bir tablo kilidi de gerekir. Yapması gereken diğer işlere kıyasla, çok pahalı olmayan bir pg_class güncellemesi. –

0

Sistemlenebilir pg_attribute hala eski (silinmiş) sütunları gösterir. Nedenini bilmiyorum, ama bana bir böcek gibi geliyor.

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

Eğer [email protected] veya http://www.postgresql.org/support/submitbug için, basit bir örnekle de dahil olmak üzere bir hata raporu gönderebilir misiniz?

+0

Bellek hizmet veriyorsa, aslında işlemle ilgili değişiklik tablo ifadeleri için var. Ama evet, en sonunda sırayı düşürmeli. :-) –

+1

Hayır, bu bir hata değil. –

İlgili konular