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