2012-03-28 3 views
2

17Million 레코드가있는 테이블에 think-sphinx delta 열을 추가해야합니다. 그런 다음 해당 필드를 인덱싱해야합니다.다운 타임없이 열 추가

DB는 포스트그레스입니다.이 열을 추가하면 노출 시간이 1 시간 정도 줄어들어 테이블 전체를 잠글 수 없도록 테이블을 변경할 수있는 제안/아이디어가 생깁니다.

+0

왜 업데이트하는 데 시간이 걸릴 것이라고 생각하십니까? 방금 3,400,000 행의 생산 테이블에 대한 테스트를 수행했습니다. 새 열을 추가하는 데 소요 된 시간은 4.366ms, 색인 생성 시간은 8725.777ms였습니다. – strkol

답변

1

테이블 잠금을 피할 수있는 유일한 해결책은 원하는 구조로 새 테이블을 만드는 것입니다. 그런 다음 INSERT INTO ... SELECT을 사용하여 해당 테이블을 채우고 새 인덱스를 포함하여 모든 인덱스를 다시 만든 다음 새 테이블의 이름을 이전 테이블로 바꿉니다.

트랜잭션의 테이블 이름을 바꾸면 클라이언트가이를 알 수 없도록 할 수 있습니다 (단, RENAME은 배타적 잠금을 얻을 때까지 기다릴 것으로 생각되기 때문에 다소 시간이 걸릴 수 있습니다).

해당 테이블을 참조하는 외래 키를 다시 만들어야합니다 (그와 관련된 잠금 수준에 대한 확신이 없음).

물론 테이블의 전체 복사본을 유지할 수있는 충분한 공간이있는 경우에만 가능합니다.

+0

그리고 이런 일이 발생하는 동안 아무도 원래 테이블을 업데이트하지 않으면 – xordon