2012-11-02 2 views
10

열 또는 열 그룹에 지정된 UNIQUE 제약 조건이 Postgres DB의 쓰기 성능에 영향을 줍니까? 내부적으로 어떻게 작동합니까?고유 제약 조건이 Postgres DB의 쓰기 성능에 미치는 영향

즉, 새 레코드를 삽입 할 때 고유 검사를 수행합니까? 그렇다면 어떻게 그 일을합니까? DB에 이미 존재하는 중복 값에 대한 선형 검색을 수행합니까? 이 경우 성능에 영향을 미치는 것으로 간주됩니다. 즉 고유 한 제약 조건의 수가 더 많으면 쓰기/삽입 성능이 더 높아 집니까? 사실입니까?

답변

20

UNIQUE 제약 조건 또는 PRIMARY KEY을 만들면 UNIQUE btree 인덱스가 만들어집니다. 이 인덱스는 레코드가 INSERT ed, UPDATE ed 또는 DELETE d 일 때마다 업데이트해야합니다. 이면 인덱싱 된 열이 변경됩니다. 인덱스 된 열이 변경되지 않으면 HOT (힙만 튜플 최적화)가 실행되어 인덱스 업데이트를 피할 수 있습니다. 특히 페이지에 공백을 넣을 기본값이 아닌 FILLFACTOR이있는 경우에 유용합니다.

삽입/업데이트시 인덱스 업데이트에 시간이 걸리므로 UNIQUE 인덱싱 된 테이블에 삽입하는 것이 고유 인덱스 또는 기본 키없이 삽입하는 것보다 느립니다. UPDATE에 대해서도 마찬가지이지만 인덱스를 사용하여 업데이트 할 튜플을 찾고 (seqscan을 피하는 경우) 일반적으로 인덱스가없는 대 순수한 승리를 얻습니다. 다른 인덱스를 사용하여 튜플을 찾거나 seqscan이 더 빠르면 (작은 테이블에서도 마찬가지 임) INSERT처럼 인덱스에 아무런 이점이 없으며 해당 작업에 대해 인덱스를 업데이트하기위한 쓰기 비용 만 발생합니다. 이는 UNIQUE 인덱스뿐만 아니라 모든 인덱스에 해당됩니다.

UNIQUE 색인화 된 열의 각 INSERT 또는 UPDATE에는 색인 조회가 있어야 기존 키와 충돌하지 않는지 확인해야합니다. 모호한 기억에서 이것은 새로운 엔트리를 인덱스에 삽입하는 과정과 결합됩니다. 그러나 나는 100 % 확실하지 않습니다.

AFAIK DELETE은 색인에 영향을주지 않습니다. 힙의 튜플에 대해 xmax을 설정합니다.

ROLLBACK 트랜잭션 또는 트랜잭션이 성공적으로 삽입 또는 업데이트 된 후 오류가있는 경우에도 UNIQUE 제한 열에서 인덱스가 업데이트됩니다. autovacuum에 의한 VACUUM 작업은 나중에 데드 인덱스 항목을 정리합니다. Concurrency Control in the PostgreSQL manual을 참조하십시오.

PRIMARY KEY에 대해서도 마찬가지이며, 이는 UNIQUE 색인을 사용하여 구현됩니다.

PRIMARY KEYUNIQUE 제약 조건이 사용하는 모든 인덱스는 쓰기 성능에 불이익을줍니다.

+0

답변 해 주셔서 감사합니다. 이것은 아주 잘 설명되었습니다. 기본 키가 레코드의 정렬 순서에도 영향을 줍니까? 내 다른 질문에 대한 답변을 제공 할 수 있다면 정말 좋습니다 : http://stackoverflow.com/questions/13190720/what-is-theorder-of-records-when-the-primary-key-is-the- 특정 그룹에 지정됨 –

관련 문제