2011-07-07 13 views
5

Mam tabelę w bazie danych PostgreSQL, która jest używana w środowisku testowym, gdzie musimy dodawać i upuszczać kilka kolumn na raz. Problem polega na tym, że postgres ma maksymalnie 1600 kolumn, a liczba ta obejmuje zrzucone kolumny. Moja tabela nigdy nie będzie miała 1600 całkowitych kolumn "niezamocowanych", ale z biegiem czasu gromadzi się do ponad 1600 z kroplami.Wyczyść postgres wiedzy o zrzuconych kolumnach

Próbowałem za pomocą VACUUM i VACUUM FULL, a próbowałem przekształcenia istniejącej kolumny jako własnego typu (ALTER TABLE table ALTER COLUMN anycol TYPE anytype) spowodowania postgres skanować wszystkie kolumny i oczyścić pamięć spadła z kolumn, ale żaden z te resetują postgres "` numer kolumny. "

Wiem, że można to rozwiązać, kopiując całą tabelę, ale to ma swoje własne problemy i jest w osobnym pytaniu.

Czy znasz sposób, aby postgre zapomnieć, że spadły kolumny?

Wiem, że Postgres nie został zaprojektowany dla takich aplikacji, ale nie zamierzam się zastanawiać, dlaczego zdecydowaliśmy się go wdrożyć w ten sposób. Jeśli masz alternatywne narzędzie do użycia, chciałbym o tym usłyszeć, ale nadal chciałbym znaleźć rozwiązanie tego problemu.

+0

Powiedziałeś, że wypróbowałeś "VACUUM" na stole. A co z "VACUUM FULL"? Lub może, 'ALTER tabeli tabeli ALTER COLUMN anyycol TYPE anytype;', zmieniając kolumnę na ten sam typ, który już ma. –

+0

Jak już wiesz, istnieją co najmniej dwa sposoby1): CREATE TABLE nowe AS wybierz * Z tabeli_table; zmieniać nazwy; Innym jest pg_dump - ttable; upuść stół; odtwórz tabelę z wyników pg_dump. W obu przypadkach będziesz musiał zrekonstruować ograniczenia FK (co jest nieco prostsze w drugim przypadku). – joop

Odpowiedz

5

Nie jest to możliwe, poza odtworzeniem tabeli, jak już się dowiedziałeś.

W przeciwnym razie system bazy danych musiałby być w pewien sposób śledzony, gdy pamięć używana przez upuszczoną kolumnę została wyczyszczona wszędzie, a następnie przenumerować atrybuty. To byłoby niewiarygodnie drogie i skomplikowane.

+0

Dobrze wiedzieć. Teraz muszę tylko wymyślić, jak [skutecznie skopiować tabelę] (http://stackoverflow.com/questions/6601978/completely-copying-a-postgres-table-with-sql) – Erik

+2

Dla mnie to wygląda jak zadanie dla VACUUM FULL (w tym ANALYZE?), i tak przepisuje tabelę i wymaga blokady tabeli. Aktualizacja pg_class nie może być zbyt droga w porównaniu do wszystkich innych zadań, które musi wykonać. –

0

Systemowa wartość pg_attribute nadal pokazuje stare (usunięte) kolumny. Nie wiem dlaczego, ale dla mnie wygląda jak błąd.

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

mógłbyś wysłać wypełnienie i wysłanie, w tym prostym przykładzie, do [email protected] lub http://www.postgresql.org/support/submitbug?

+0

Jeśli pamięć jest obsługiwana, to faktycznie istnieje tam dla instrukcji tablic zmieniających transakcje. Ale tak, powinien ostatecznie zrzucić ten wiersz. :-) –

+1

Nie, to nie jest błąd. –