인덱스 액세스 방법은 여러 프로세스로 인덱스의 동시 업데이트를 처리해야합니다. 핵심무지개 토토시스템 획득accesssharelock
인덱스 스캔 중 인덱스에서RowExClusivelock
인덱스를 업데이트 할 때 (일반 포함진공
). 이러한 잠금 유형은 충돌하지 않기 때문에 액세스 방법은 필요한 미세한 잠금을 처리하는 데 도움이됩니다.액세스 독점
인덱스 생성, 파괴 또는 중에 만 인덱스를 잠그십시오.Reindex
(공유 업데이트 독점
대신동시에
).
동시 업데이트를 지원하는 인덱스 유형 구축에는 일반적으로 필요한 동작에 대한 광범위하고 미묘한 분석이 필요합니다. B-Tree 및 Hash 색인 유형의 경우 관련된 설계 결정에 대해 읽을 수 있습니다.src/backend/access/nbtree/readme
andsrc/backend/access/hash/readme
.
색인의 내부 일관성 요구 사항 외에 동시 업데이트는 상위 테이블 ( 간의 일관성에 대한 문제를 만듭니다.힙) 및 인덱스. 왜냐하면무지개 토토힙의 액세스 및 업데이트를 인덱스의 액세스 및 업데이트를 분리하면 인덱스가 힙과 일치하지 않는 창이 있습니다. 우리는 다음 규칙 으로이 문제를 처리합니다.
인덱스 항목을 작성하기 전에 새 힙 입력이 이루어집니다. (따라서 동시 인덱스 스캔은 힙 항목을 보지 못할 가능성이 높습니다. 어쨌든 인덱스 리더가 무관심하지 않기 때문에 괜찮습니다. 그러나 참조 참조.PostgreSQL : 문서 : 17 : 62.5. 토토 사이트 순위 고유성.)
힙 입력을 삭제할 때 (진공
), 모든 인덱스 항목을 먼저 제거해야합니다.
인덱스 스캔은 인덱스 페이지에서 핀을 유지해야합니다.amgettuple
및Ambulkdelete
다른 백엔드에서 고정 된 페이지에서 항목을 삭제할 수 없습니다. 이 규칙의 필요성은 아래에 설명되어 있습니다.
세 번째 규칙이 없으면 인덱스 리더가 인덱스 항목을 제거하기 직전에 인덱스 항목을 볼 수 있습니다.진공
진공
. 독자가 도달 할 때 해당 항목 번호가 여전히 사용되지 않는 경우 심각한 문제가 발생하지 않습니다. 빈 항목 슬롯은 무시되므로heap_fetch ()
. 그러나 세 번째 백엔드가 이미 다른 것에 대한 항목 슬롯을 재사용했다면 어떨까요? MVCC 호환 스냅 샷을 사용하는 경우 슬롯의 새로운 탑승자가 스냅 샷 테스트를 통과하기에는 너무 새로워지기 때문에 문제가 없습니다. 그러나 MVCC 호환 스냅 샷 (예 :Snapshotany
), 실제로 스캔 키와 일치하지 않는 행을 수락하고 반환 할 수 있습니다. 우리는 모든 경우에 스캔 키를 힙으로 다시 확인하도록 하여이 시나리오를 방어 할 수 있지만 너무 비쌉니다. 대신, 우리는 인덱스 페이지의 핀을 프록시로 사용하여 독자가 여전히임을 나타냅니다.“비행에서”인덱스 항목에서 일치하는 힙 항목까지. 만들기Ambulkdelete
그러한 핀의 블록진공
독자가 완료되기 전에 힙 항목을 삭제할 수 없습니다. 이 솔루션은 런타임이 거의 들지 않으며 실제로 충돌이있는 드문 경우에만 오버 헤드 차단을 추가합니다.
이 솔루션은 인덱스 스캔이 필요합니다“동기”: 해당 인덱스 항목을 스캔 한 후 즉시 각 힙 튜플을 가져와야합니다. 이것은 여러 가지 이유로 비싸다.“비동기”인덱스에서 많은 TID를 수집하고 나중에 힙 튜플 만 방문하는 스캔은 인덱스 잠금 오버 헤드가 훨씬 적고보다 효율적인 힙 액세스 패턴을 허용 할 수 있습니다. 위의 분석에 따르면 MVCC 호환 스냅 샷에 동기식 접근 방식을 사용해야하지만 MVCC 스냅 샷을 사용하여 쿼리를 위해 비동기 스캔이 작동합니다..
inAmgetBitMap
인덱스 스캔, 액세스 방법은 반환 된 튜플에 인덱스 핀을 유지하지 않습니다. 따라서 MVCC 호환 스냅 샷과 함께 이러한 스캔을 사용하는 것이 안전합니다.
언제ampredlocks
플래그가 설정되지 않았으며, 직렬화 가능한 트랜잭션 내에서 해당 인덱스 액세스 방법을 사용하는 스캔은 전체 인덱스에서 비 차단 술어 잠금 장치를 얻습니다. 이로 인해 동시 직렬화 가능한 트랜잭션에 의해 튜플의 삽입물과 해당 지수에 삽입 된 읽기 낭비 충돌이 생성됩니다. 일련의 일련의 직렬화 가능한 트랜잭션에서 특정 패턴의 읽기 제기 충돌이 감지되면, 데이터 무결성을 보호하기 위해 해당 트랜잭션 중 하나가 취소 될 수 있습니다. 플래그가 설정되면 인덱스 액세스 방법이 미세한 입자 술어 잠금을 구현하여 이러한 트랜잭션 취소의 빈도를 줄이는 경향이 있습니다..
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면