많은 양의 데이터가있는 기존 테이블에 인덱스를 추가하면 어떻게됩니까?


11

약 1,500 만 건의 레코드가 포함될 테이블이 있습니다. 이제 테이블에 인덱스를 추가해야합니다.

색인을 추가하면 테이블의 모든 항목을 업데이트하는 데 시간이 걸립니다.

인덱스를 추가하면 가동 중지 시간이 발생하는지 혼란 스럽습니다.

그렇다면 다운 타임을 어떻게 극복 할 수 있습니까?


답변:


10

plain을 사용하면 CREATE INDEX쓰기를 위해 테이블이 잠기지 만 읽기는 불가능합니다.

CREATE INDEX CONCURRENTLY쓰기 잠금을 피하기 위해 사용하십시오 .

보내는 사람 에 PostgreSQL의 문서CREATE INDEX :

이 옵션을 사용하면 PostgreSQL은 테이블에서 동시 삽입, 업데이트 또는 삭제를 방지하는 잠금을 수행하지 않고 인덱스를 빌드합니다. 반면 표준 인덱스 빌드는 테이블이 완료 될 때까지 테이블에 대한 쓰기 (읽지는 않지만 읽기)를 잠급니다. 이 옵션을 사용할 때주의해야 할 몇 가지주의 사항이 있습니다 . 동시에 색인 작성을 참조하십시오 .

그리고 더 구체적으로 ( @ypercube 와 같이 ) :

PostgreSQL은 쓰기를 잠그지 않고 인덱스 작성 지원합니다 . 이 방법은 CONCURRENTLY옵션을 지정하여 호출합니다 CREATE INDEX. 이 옵션을 사용하면 PostgreSQL은 두 번의 테이블 스캔을 수행해야하며, 잠재적으로 인덱스를 사용하여 종료 될 수있는 모든 기존 트랜잭션을 기다려야합니다. 따라서이 방법은 표준 색인 빌드보다 더 많은 총 작업이 필요하며 완료하는 데 시간이 훨씬 오래 걸립니다. 그러나 인덱스가 작성되는 동안 정상적인 조작을 계속할 수 있으므로이 방법은 프로덕션 환경에서 새 인덱스를 추가하는 데 유용합니다.

대담한 강조 광산.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.