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 KEY
및 UNIQUE
제약 조건이 사용하는 모든 인덱스는 쓰기 성능에 불이익을줍니다.
답변 해 주셔서 감사합니다. 이것은 아주 잘 설명되었습니다. 기본 키가 레코드의 정렬 순서에도 영향을 줍니까? 내 다른 질문에 대한 답변을 제공 할 수 있다면 정말 좋습니다 : http://stackoverflow.com/questions/13190720/what-is-theorder-of-records-when-the-primary-key-is-the- 특정 그룹에 지정됨 –