색인 액세스 방법은 다음의 동시 업데이트를 처리해야 합니다. 여러 프로세스로 색인을 생성합니다. 핵심포스트그레SQL시스템 획득액세스공유잠금인덱스 스캔 중 인덱스에 대해, 그리고RowExclusiveLock업데이트할 때 스포츠 토토(일반 포함)진공). 이후 이러한 잠금 유형은 충돌하지 않으며 액세스 방법은 다음과 같습니다. 필요할 수 있는 세부적인 잠금을 처리할 책임이 있습니다. 안 인덱스 전체에 대한 배타적 잠금은 다음 동안에만 수행됩니다. 인덱스 생성, 소멸,REINDEX또는진공이 가득 참.
동시 업데이트를 지원하는 색인 유형 구축 일반적으로 필요한 사항에 대한 광범위하고 미묘한 분석이 필요합니다. 행동. b-트리 및 해시 인덱스 유형의 경우 다음 내용을 읽을 수 있습니다. 관련된 디자인 결정src/백엔드/액세스/nbtree/README그리고src/백엔드/액세스/해시/README.
스포츠 토토 자체의 내부 일관성 요구 사항 외에도, 동시 업데이트는 상위 테이블(힙) 및 스포츠 토토입니다. 왜냐면PostgreSQL별도 인덱스에서 힙에 액세스하고 업데이트합니다. 인덱스가 힙과 일치하지 않을 수 있는 창입니다. 우리는 다음 규칙에 따라 이 문제를 처리합니다.
스포츠 토토 항목을 만들기 전에 새로운 힙 항목이 만들어졌습니다. (따라서 동시 인덱스 스캔이 실패할 가능성이 높습니다. 힙 항목. 스포츠 토토 판독기가 어쨌든 커밋되지 않은 행에는 관심이 없습니다. 하지만 보세요PostgreSQL : 문서 : 8.2 : 색인 토토 확인.)
힙 항목이 삭제될 때(by진공), 해당 스포츠 토토 항목을 모두 제거해야 합니다. 먼저.
스포츠 토토 스캔은 스포츠 토토 페이지에 핀을 유지해야 합니다
마지막으로 반환한 항목을 보관함amgettuple및ambulkdelete항목을 삭제할 수 없습니다.
다른 백엔드에 의해 고정된 페이지. 이에 대한 필요성
규칙은 아래에 설명되어 있습니다.
세 번째 규칙이 없으면 색인 리더는 다음을 수행할 수 있습니다.
다음에 의해 제거되기 직전의 색인 항목을 참조하세요.진공, 그리고 해당 항목에 도착합니다.
그 이후의 힙 항목은에 의해 제거되었습니다.진공. 다음과 같은 경우에는 심각한 문제가 발생하지 않습니다.
항목 번호는 독자가 해당 항목에 도달해도 여전히 사용되지 않습니다.
빈 항목 슬롯은 다음에서 무시됩니다.heap_fetch(). 하지만 세 번째 백엔드에
이미 아이템 슬롯을 다른 용도로 재사용하셨나요? 사용할 때
MVCC 호환 스냅샷은 새로운 기능이므로 문제가 없습니다.
슬롯 점유자는 너무 새로운 사람이므로 통과할 수 없습니다.
스냅샷 테스트. 그러나 MVCC를 준수하지 않는 스냅샷(예:
와 같이SnapshotNow), 다음이 가능할 것입니다.
실제로 스캔과 일치하지 않는 행을 수락하고 반환합니다.
열쇠. 스캔을 요구하여 이 시나리오를 방어할 수 있습니다.
모든 경우에 힙 행에 대해 키를 다시 확인해야 하지만
너무 비싸요. 대신에 우리는 색인 페이지에 핀을 사용합니다.
독자가 아직 있을 수 있음을 나타내는 프록시"비행 중"스포츠 토토 항목부터 일치 항목까지
힙 항목. 만들기ambulkdelete이러한 핀을 차단하면 다음이 보장됩니다.진공리더가 작업을 완료하기 전에는 힙 항목을 삭제할 수 없습니다.
이 솔루션은 런타임 비용이 거의 들지 않으며 차단 기능이 추가됩니다.
실제로 오버헤드가 발생하는 드문 경우에만 오버헤드가 발생합니다.
갈등.
이 솔루션을 사용하려면 스포츠 토토 스캔이 필요합니다."동기식": 각 힙 튜플을 가져와야 합니다. 해당 인덱스 항목을 스캔한 직후. 이것은 여러 가지 이유로 비싸다. 안"비동기"많은 TID를 수집하는 스캔 인덱스에서 나중에 언젠가 힙 튜플을 방문합니다. 훨씬 적은 인덱스 잠금 오버헤드가 필요하며 더 많은 작업을 허용할 수 있습니다. 효율적인 힙 액세스 패턴. 위의 분석에 따라 우리는 MVCC를 준수하지 않는 스냅샷에는 동기식 접근 방식을 사용합니다. 그러나 MVCC를 사용하는 쿼리에는 비동기 스캔이 가능합니다. 스냅샷.
안에amgetmulti스포츠 토토 스캔,
액세스 방법은 다음 위치에 인덱스 핀을 유지한다고 보장할 필요가 없습니다.
반환된 튜플 (더 이상 고정하는 것은 비현실적입니다.
어쨌든 마지막 것입니다.) 그러므로 그러한 스캔을 사용하는 것이 안전합니다.
MVCC 호환 스냅샷을 사용합니다.