스포츠 토토 액세스 방법은 동시 업데이트를 처리해야합니다 여러 프로세스로 스포츠 토토. 핵심PostgreSQL시스템 획득accesssharelock인덱스 스캔 중 인덱스에서 그리고ROWEXCLUSIVELOCK업데이트 할 때 스포츠 토토 (일반 포함진공). 부터 이러한 잠금 유형은 충돌하지 않으며 액세스 방법은 다음과 같습니다. 필요한 미세한 잠금을 처리 할 책임이 있습니다. an 전체적으로 인덱스에 대한 독점 잠금은 색인 생성, 파괴,Reindex또는진공 Full.
동시 업데이트를 지원하는 인덱스 유형 구축 일반적으로 필요한 것을 광범위하고 미묘한 분석이 필요합니다 행동. B- 트리 및 해시 인덱스 유형의 경우 읽을 수 있습니다. 관련된 디자인 결정src/backend/access/nbtree/readme및src/backend/access/hash/readme.
지수 자체의 내부 일관성 요구 사항을 제외하고 동시 업데이트는 부모 테이블 (힙) 및 인덱스. 왜냐하면PostgreSQL분리 인덱스의 힙에 대한 액세스 및 업데이트 인덱스가 힙과 일치하지 않는 창입니다. 우리는 다음 규칙 으로이 문제를 처리합니다.
인덱스 항목을 작성하기 전에 새 힙 입력이 이루어집니다. (따라서 동시 인덱스 스캔이 보지 못할 가능성이 높습니다. 힙 입구. 인덱스 리더가 원하기 때문에 괜찮습니다 어쨌든 커밋되지 않은 줄에 관심이 없습니다. 하지만 참조PostgreSQL : 문서 : 8.2 : 색인 토토 확인.)
힙 입력을 삭제할 때 (진공), 모든 인덱스 항목을 제거해야합니다 첫 번째.
인덱스 스캔은 인덱스 페이지에서 핀을 유지해야합니다.
마지막으로 반환 된 품목을 |amgettuple
및Ambulkdelete
항목을 삭제할 수 없습니다
다른 백엔드에 의해 고정 된 페이지. 이것에 대한 필요성
규칙은 아래에 설명되어 있습니다.
세 번째 규칙이 없으면 인덱스 리더가 가능합니다.
스포츠 토토 항목이 제거되기 직전을 확인하십시오.진공그리고 해당에 도달합니다
그 후 힙 입력은에 의해 제거되었습니다.진공. 그렇다면 심각한 문제가 발생하지 않습니다
항목 번호는 독자가 도달 할 때 여전히 사용하지 않습니다.
빈 항목 슬롯은에 의해 무시됩니다heap_fetch ()
. 그러나 세 번째 백엔드가 있다면 어떨까요?
이미 다른 것에 대한 항목 슬롯을 재사용 했습니까? AN을 사용할 때
MVCC 호환 스냅 샷, 새로운 것이기 때문에 아무런 문제가 없습니다
슬롯의 탑승자는
스냅 샷 테스트. 그러나 비 MVCC 호환 스냅 샷 (예 :
처럼SnapshotNow) 가능합니다
실제로 스캔과 일치하지 않는 행을 수락하고 반환합니다.
열쇠. 스캔을 요구 하여이 시나리오로부터 방어 할 수 있습니다.
모든 경우에 힙으로 다시 확인해야하지만
너무 비싸다. 대신, 우리는 인덱스 페이지의 핀을
독자가 여전히있을 수 있음을 나타내는 프록시"비행 중"인덱스 항목에서 일치까지
힙 입력. 만들기Ambulkdelete
그러한 핀의 블록진공독자가 끝나기 전에 힙 항목을 삭제할 수 없습니다.
이 솔루션은 런타임이 거의 들지 않으며 차단을 추가합니다.
실제로있는 드문 경우에만 오버 헤드
갈등.
이 솔루션은 인덱스 스캔이 필요합니다"동기": 각 힙 튜플을 가져와야합니다 해당 인덱스 항목을 스캔 한 직후. 이것은 여러 가지 이유로 비싸다."비동기"많은 TID를 수집하는 스캔 지수에서, 나중에 힙 튜플 만 방문하십시오. 인덱스 잠금 오버 헤드가 훨씬 적고 더 많은 것을 허용 할 수 있습니다. 효율적인 힙 액세스 패턴. 위의 분석에 따라 우리는해야합니다 비 MVCC 호환 스냅 샷에 동기식 접근법을 사용하십시오. 그러나 비동기 스캔은 MVCC를 사용하여 쿼리를 위해 작동합니다. 스냅 사진.
inAmgetmulti
스포츠 토토 스캔, the
액세스 방법은
반환 된 튜플. (더 많은 것을 고정하는 것은 비현실적 일 것입니다
어쨌든 마지막.) 그러므로 그러한 스캔을 사용하는 것은 안전합니다.
MVCC 호환 스냅 샷으로.