PostgreSQL은 NULL이 아닌 DEFAULT로 열 추가를 최적화합니까?


10

NOT NULL이있는 열을 추가 할 때 DEFAULTPostgreSQL이이 작업을 최적화합니까?

테이블에 n 개의 행이있는 경우 최적화되지 않은 alter-table-add-column은 기본값 n 쓰기를 생성하므로 매우 고통 스럽습니다. 최적화를 통해 DB는 즉시 새로운 열을 생성하고, 적절한 인덱스 데이터 구조에서 해당 열에 대해 기본값이 아닌 값을 찾을 수 없을 때 반환되는 기본값의 복사본 하나만 저장합니다.

예를 들어 Oracle 11g는 이러한 최적화 기능을 갖추고 있습니다.

답변:


16

PostgreSQL에는 이러한 메커니즘이 없습니다.

그러나 여전히 이러한 테이블 변경으로 인한 과도한 영향을 피할 수 있습니다.

다음 명령문은 명령문 / 트랜잭션 기간 동안 테이블에 대한 액세스 독점 잠금 을 획득 합니다.

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

이 명령문은 카탈로그를 변경 한 다음 새 열에 모든 행의 기본값이 포함되도록 전체 테이블을 다시 작성합니다. 테이블에 많은 행이 있고 자주 액세스되는 경우 일시적인 문제가 발생할 수 있습니다.

이를 방지하려면 독점 잠금 장치를 가능한 한 짧게 유지하십시오.

ALTER TABLE your_table
    ADD COLUMN new_column integer;
ALTER TABLE your_table
    ALTER COLUMN new_column SET DEFAULT 0;

이것은 기본적으로 카탈로그에 대한 (실제로 두 번) 변경 (데이터 변경은 발생하지 않음)이므로 매우 빠르게 완료됩니다. 그런 다음 필요와 테이블 사용법에 따라 한 단계 또는 일괄 적으로 새 열을 기본값으로 업데이트하고 완료되면 열을로 설정하십시오 NOT NULL.

희망 사항에 대한 업데이트 : PostgreSQL 11에이 기능이 있습니다. 자세한 내용은 https://www.depesz.com/2018/04/04/waiting-for-postgresql-11-fast-alter-table-add-column-with-a-non-null-default/ 를 참조 하십시오 .


4

예, PostgreSQL 11과 함께

이 기능은 새로운 기능이며 버전 11에서 제공됩니다.

ALTER TABLE your_table
    ADD COLUMN new_column integer NOT NULL DEFAULT 0;

위의 명령은 이러한 최적화에 영향을받는 명령 중 하나입니다. 그러나 필수 NOT NULL아닙니다 . 널이 아닌 기본값으로 추가 된 모든 새 열이 이제 최적화되었습니다. 이 commitfest 에서 항목을 찾을 수 있습니다 . "Postgres 11에서 누락 된 링크 11 : 기본값으로 빠른 열 작성" 에 대한훌륭한 글을 확인해야 합니다 .

PostgreSQL 11 이전 해결 방법

테이블의 독점 테이블 잠금 장치를 피하려면 Craig Ringer의 조언을 따르십시오.

  • 없이 열 추가 DEFAULT
  • ALTERDEFAULT나중에 추가하여 새로 삽입 된 행에 적용합니다.
  • 그리고 진보적 배치하여 기존 행에 새 열 채울 UPDATE
  • 모든 행에 값이 있으면 NOT NULL제약 조건 을 추가합니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.