12

큰 데이터 세트가있는 테이블이 있으며이 테이블에는 삭제할 세 개의 열이 있습니다.
질문 : Postgres는 어떻게 처리할까요?대형 데이터 세트의 Postgres에 열을 놓기

모든 항목을 살펴 보거나 매핑 정보를 오버 헤드없이 업데이트 할 예정입니까? 이 특별한 경우에 ALTER TABLE을 만들거나 스왑 테이블을 사용해야합니까?

그리고 차이가 나는 경우 세 열 모두 고정 길이 (두 개의 정수와 한 개의 숫자)입니다. 이미 요청을받은 않다면

는 미안하지만 구글은

답변

20

ALTER TABLE의 DROP COLUMN에 그냥 단지 시스템 테이블에 열을 사용하지 않습니다 ... 어떤 관련 질문/기사를 찾을 수 없습니다. 매우 빠르지 만 힙 파일에서 데이터를 제거하지는 않습니다. 할당 된 파일 공간을 축소하려면 나중에 VACUUM FULL을 수행해야합니다. 그래서 ALTER TABLE DROP COLUMN은 매우 빠릅니다. 그리고 파일을 압축하면 더 느리게 (독점 잠금으로) VACUUM FULL을 호출해야합니다.

16

구글은이 질문에 대한 쓸모가있을 수 있지만, the manual rarely fails :

DROP COLUMN 형태가 물리적으로 열을 제거하지 않지만, 단순히 SQL 작업에 그것이 눈에 보이지 않는 수 있습니다. 테이블의 후속 삽입 및 업데이트 작업은 열에 대해 null 값을 저장합니다. 따라서 열을 삭제하는 것은 빠르지 만 놓은 열이 차지한 공간을 다시 차지하지 않기 때문에 즉시 테이블의 디스크 크기를 으로 줄이지는 못합니다. 공백은 기존 행이 업데이트됨에 따라 시간이 지남에 따라 교정됩니다.

그리고 :

테이블의 즉시 재 작성을 강제하려면, 당신은 FULL VACUUM, CLUSTER 또는 재 작성을 강제 ALTER 테이블의 형태 중 하나를 사용할 수 있습니다. 이 은 테이블에서 의미 상으로 눈에 보이는 변화가 없지만 더 이상 유용하지 않은 데이터 인 을 제거합니다.

즉, 시스템 카탈로그 테이블 내의 열 pg_attributeattisdroppedTRUE로 설정된다.

+2

흥미롭게도 행 업데이트가 삭제 된 열에 NULL을 "저장"합니다. postgresql은 선택적 "null 비트 맵"에서 비트를 설정하여 null을 저장하기 때문에 _every_ 행에는 표시되는 행이없는 경우에도 null 비트 맵 (삭제되거나 삭제되지 않은 8 개의 열마다 1 바이트 크기)이 있어야합니다. 없는 –