12

Więc mam tabelę z dużym zbiorze danych i tabela ta ma trzy kolumny, które chciałbym spadać.
Pytanie brzmi: w jaki sposób Postgres sobie z tym poradzi?Usunięcie kolumny w PostgreSQL na dużym zbiorze

Będzie to spacer po każdym wejściu lub będzie po prostu zaktualizować informacje odwzorowania bez większego napowietrznych? Czy mogę po prostu zrobić ALTER TABLE lub powinienem użyć tabeli wymiany w tym konkretnym przypadku?

A jeśli to robi żadnej różnicy, wszystkie trzy kolumny mają stałą długość (dwie liczby całkowite i jeden numeryczna).

Przepraszam jeśli został już poproszony, ale Google nie można znaleźć żadnych związanych pytania/artykuły ...

Odpowiedz

20

ALTER TABLE DROP COLUMN nie tylko tylko wyłączanie kolumn w tabelach systemowych. Jest bardzo szybki, ale nie usuwa danych z plików sterty. Musisz wykonać VACUUM FULL później, aby skompaktować przydzielony obszar plików. Więc ALTER TABLE DROP COLUMN jest bardzo szybki. A ty chcesz kompaktować pliki, musisz zadzwonić wolniej (z wyłącznym LOCKEM) VACUUM FULL.

16

Google może być bezużyteczny na to pytanie, ale the manual rarely fails:

Formularz DROP COLUMN nie fizycznie usunąć kolumnę, ale po prostu sprawia, że ​​jest niewidoczny dla operacji SQL. Kolejne operacje wstawiania i aktualizacji w tabeli będą przechowywać wartość pustą dla kolumny. W ten sposób upuszczenie kolumny jest szybkie, ale nie spowoduje natychmiastowego zmniejszenia rozmiaru na dysku twojej tabeli, ponieważ miejsce zajmowane przez zrzuconą kolumnę nie zostanie odzyskane. Miejsce zostanie odzyskane w miarę upływu czasu, ponieważ istniejące wiersze zostaną zaktualizowane.

I:

Aby wymusić natychmiastową przepisać tabeli, można użyć próżniowe Pełny, klastra lub jedną z form ALTER tabela, która zmusza do przerobienia. Ta nie powoduje żadnych widocznych semantycznie zmian w tabeli, ale pozbędzie się nieużytecznych danych.

szczególności kolumna attisdropped w tabeli katalogu układ pg_attribute jest ustawiony TRUE.

+2

Co ciekawe, ponieważ aktualizacje wierszy będą teraz "przechowywać" NULL w upuszczonych kolumnach. A ponieważ postgresql przechowuje wartości null ustawiając bit w opcjonalnej "pustej mapie bitowej", _every_ wiersz musi teraz mieć pustą bitmapę (o rozmiarze jednego bajtu na każde osiem opuszczonych lub niezamkniętych kolumn), nawet jeśli żaden z widocznych wierszy nie jest ZERO –

Powiązane problemy