이 문서는 지원되지 않는 버전의 PostgreSQL 용입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다PostgreSQL : 문서 : 17 : 11.9. 스포츠 윈 토토 사이트 전용 스캔 및 스포츠 윈 토토 사이트 커버버전 또는 위에 나열된 다른 지원되는 버전 중 하나입니다.

11.11. 윈 토토 전용 스캔

모든 색인PostgreSQLareSecondary윈 토토 - 각 윈 토토가 테이블의 주요 데이터 영역과 별도로 저장됨을 의미합니다 (테이블이라고합니다.inPostgreSQL용어). 이는 일반적인 윈 토토 스캔에서 각 행 검색은 윈 토토와 힙 모두에서 데이터를 가져 오는 것이 필요하다는 것을 의미합니다. 또한, 주어진 색인 가능한 윈 토토 항목은여기서조건은 일반적으로 윈 토토에서 서로 가깝게, 참조하는 테이블 행은 힙의 어느 곳에도있을 수 있습니다. 따라서 윈 토토 스캔의 힙 액세스 부분은 힙에 많은 임의의 접근을 포함하며, 특히 전통적인 회전 매체에서 느릴 수 있습니다. (에 설명 된대로PostgreSQL : 문서 : 10 : 11.5. 여러 스포츠 토토 베트맨 결합, 비트 맵 스캔은 정렬 된 순서로 힙 액세스를 수행 하여이 비용을 완화 시키려고하지만 지금까지만 진행됩니다.)

이 성능 문제를 해결하려면PostgreSQL지원윈 토토 전용 스캔, 힙 액세스없이 윈 토토만으로 쿼리에 응답 할 수 있습니다. 기본 아이디어는 관련 힙 항목에 상담하는 대신 각 윈 토토 항목에서 값을 직접 반환하는 것입니다. 이 방법을 사용할 수있는시기에는 두 가지 기본 제한이 있습니다.

  1. 9916_10406

  2. 쿼리는 윈 토토에 저장된 열만 참조해야합니다. 예를 들어, 열에 대한 색인이 주어지면xandy열이있는 테이블의z,이 쿼리는 윈 토토 전용 스캔을 사용할 수 있습니다 :

    x = '키'에서 x, y를 선택합니다.
    x = '키'와 y <42;에서 x를 선택하십시오.

    그러나이 쿼리는 다음과 같습니다.

    X = '키'에서 X, Z를 선택합니다.
    x = '키'와 z <42;에서 x를 선택하십시오.

    (표현 윈 토토 및 부분 색인은 아래에서 논의 된 대로이 규칙을 복잡하게합니다.)

이 두 가지 기본 요구 사항이 충족되면 쿼리에서 요구하는 모든 데이터 값은 인덱스에서 사용할 수 있으므로 윈 토토 전용 스캔이 물리적으로 가능합니다. 그러나 모든 테이블 스캔에 대한 추가 요구 사항이 있습니다.PostgreSQL: 검색 된 각 행이임을 확인해야합니다.가시적Query의 MVCC 스냅 샷으로PostgreSQL : 문서 : 10 : 13 장. 무지개 토토 제어. 가시성 정보는 윈 토토 항목에 저장되지 않으며 힙 항목에만 저장됩니다. 따라서 언뜻보기에 모든 행 검색에는 어쨌든 힙 액세스가 필요할 것 같습니다. 그리고 최근에 테이블 행이 최근에 수정 된 경우입니다. 그러나 거의 변화하는 데이터의 경우이 문제에 대한 방법이 있습니다.PostgreSQL트랙, 테이블 힙의 각 페이지마다 해당 페이지에 저장된 모든 행이 모든 현재 및 미래의 트랜잭션에 볼 수있을 정도로 오래되었는지 여부를 추적합니다. 이 정보는 테이블에 약간 저장됩니다가시성 맵. 윈 토토 전용 스캔은 후보 인덱스 항목을 찾은 후 해당 힙 페이지의 가시성 맵 비트를 확인합니다. 설정된 경우 행에 가시가 표시되어 추가 작업없이 데이터를 반환 할 수 있습니다. 설정되지 않은 경우 힙 입력을 방문하여 표시되는지 여부를 찾아야하므로 표준 인덱스 스캔을 통해 성능 이점이 얻지 못합니다. 성공적인 경우 에도이 접근법은 가시성 맵 액세스에 대한 힙 액세스에 대한 거래를 거래합니다. 그러나 가시성 맵은 설명하는 힙보다 4 배 더 작기 때문에 액세스하는 데 훨씬 적은 물리적 I/O가 필요합니다. 대부분의 상황에서 가시성 맵은 항상 메모리에 캐싱됩니다.

간단히 말해서, 두 가지 기본 요구 사항을 고려할 때 윈 토토 전용 스캔이 가능하지만 테이블 힙 페이지의 상당 부분에 가시 가능한 맵 비트가 설정된 경우에만 승리됩니다. 그러나 행의 많은 부분이 변하지 않는 테이블은 이러한 유형의 스캔을 실제로 매우 유용하게 만들기에 충분히 일반적입니다.

윈 토토 전용 스캔 기능을 효과적으로 사용하려면 선행 열만 일치하는 인덱스를 작성하도록 선택할 수 있습니다여기서조항, 후행 열이 유지되는 동안Payload쿼리로 반환 할 데이터. 예를 들어, 일반적으로 Queries와 같은 쿼리를 실행하면

x = '키'; 탭에서 y를 선택합니다.

그러한 쿼리 속도를 높이기위한 전통적인 접근 방식은 in 인덱스를 만드는 것입니다x만. 그러나 색인(x, y)이 쿼리를 윈 토토 전용 스캔으로 구현할 가능성을 제공합니다. 앞서 논의한 바와 같이, 그러한 지수는 더 크고 인덱스보다 더 비싸다x단독으로 테이블이 대부분 정적 인 것으로 알려진 경우에만 매력적입니다. 윈 토토가 선언되는 것이 중요합니다(x, y)not(y, x), 대부분의 윈 토토 유형 (특히 B- 트리)의 경우 주요 윈 토토 열을 제한하지 않는 검색은 그다지 효율적이지 않습니다.

원칙적으로, 윈 토토 전용 스캔을 표현 인덱스와 함께 사용할 수 있습니다. 예를 들어, 인덱스가 주어지면f (x)여기서x테이블 열이므로 실행할 수 있어야합니다

탭에서 f (x) <1;에서 f (x)를 선택합니다.

윈 토토 전용 스캔으로서; 그리고 이것은 매우 매력적입니다f ()는 비용이 많이 드는 기능입니다. 하지만,PostgreSQL의 플래너는 현재 그러한 경우에 대해 그다지 똑똑하지 않습니다. 쿼리가 모든 경우에만 윈 토토 전용 스캔을 통해 잠재적으로 실행할 수있는 것으로 간주합니다.needed by the query are available from the index. In this example,x상황을 제외하고는 필요하지 않습니다f (x), 그러나 플래너는이를 알지 못하고 윈 토토 전용 스캔이 불가능하다는 결론을 내립니다. 윈 토토 전용 스캔이 충분히 가치가있는 것처럼 보이면 인덱스가 켜져 있도록 선언함으로써 해결할 수 있습니다(f (x), x), 두 번째 열은 실제로 사용될 것으로 예상되는 곳이지만 Planner에게 윈 토토 전용 스캔이 가능하다는 것을 확신시키기 위해 거기에 있습니다. 추가 경고, 목표가 재 계산을 피하는 것이라면f (x), 플래너가 반드시의 사용과 일치 할 필요는 없다는 것입니다.f (x)색인이없는 것은여기서색인 열로의 조항. 일반적으로 위에 표시된 것과 같은 간단한 쿼리 로이 제대로됩니다. 이러한 결함은 향후 |postgresql.

부분 인덱스는 윈 토토 전용 스캔과 흥미로운 상호 작용을합니다. 에 표시된 부분 색인을 고려하십시오.예 11.3:

테스트에서 고유 한 색인 생성 _success_constraint (주제, 대상)
    어디에서 성공;

원칙적 으로이 윈 토토에 대한 색인 전용 스캔을 수행하여 쿼리를 만족시킬 수 있습니다.

주제 = 'some-huction'및 success; 인 테스트에서 대상을 선택하십시오.

그러나 문제가 있습니다 :여기서조항은성공인덱스의 결과 열로 사용할 수 없습니다. 그럼에도 불구하고, 계획이 해당 부분을 다시 확인할 필요가 없기 때문에 윈 토토 전용 스캔이 가능합니다.여기서실행 시간에 조항 : 윈 토토에있는 모든 항목이 반드시 가지고 있습니다Success = True따라서 계획에서 명시 적으로 확인할 필요는 없습니다.PostgreSQL버전 9.6 이상은 그러한 경우를 인식하고 윈 토토 전용 스캔을 생성 할 수 있지만 이전 버전은 그렇지 않습니다..