이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 11.9. 스포츠 토토 사이트 전용 스캔 및 스포츠 토토 사이트 커버버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

11.11. 윈 토토 전용 스캔

다음의 모든 색인포스트그레SQL아르보조윈 토토, 즉 각 윈 토토는 테이블의 기본 데이터 영역(테이블의 데이터 영역이라고 함)과 별도로 저장됨을 의미합니다.포스트그레SQL용어). 이는 일반 윈 토토 스캔에서 각 행 검색을 수행하려면 윈 토토와 힙 모두에서 데이터를 가져와야 함을 의미합니다. 또한, 주어진 색인 생성 가능 항목과 일치하는 색인 항목이 있는 동안어디조건은 일반적으로 윈 토토에서 서로 가깝고, 참조하는 테이블 행은 힙의 어느 곳에나 있을 수 있습니다. 따라서 윈 토토 스캔의 힙 액세스 부분에는 힙에 대한 무작위 액세스가 많이 포함되며 특히 기존 회전 미디어에서는 속도가 느려질 수 있습니다. (에 설명된 대로PostgreSQL : 문서 : 10 : 11.5. 여러 스포츠 토토 베트맨 결합, 비트맵 스캔은 정렬된 순서로 힙 액세스를 수행하여 이 비용을 완화하려고 시도하지만 이는 지금까지만 가능합니다.)

이 성능 문제를 해결하려면,포스트그레SQL지원색인 전용 스캔, 힙 액세스 없이 윈 토토만으로 쿼리에 응답할 수 있습니다. 기본 아이디어는 연관된 힙 항목을 참조하는 대신 각 윈 토토 항목에서 직접 값을 반환하는 것입니다. 이 방법을 사용할 수 있는 경우에는 두 가지 기본 제한 사항이 있습니다.

  1. 인덱스 유형은 인덱스 전용 스캔을 지원해야 합니다. B-트리 인덱스는 항상 그렇습니다. GiST 및 SP-GiST 인덱스는 일부 연산자 클래스에 대해서는 인덱스 전용 스캔을 지원하지만 다른 클래스에는 지원하지 않습니다. 다른 인덱스 유형은 지원되지 않습니다. 기본 요구 사항은 인덱스가 각 인덱스 항목의 원래 데이터 값을 물리적으로 저장하거나 재구성할 수 있어야 한다는 것입니다. 반례로, 각 인덱스 항목은 일반적으로 원래 데이터 값의 일부만 보유하므로 GIN 인덱스는 인덱스 전용 스캔을 지원할 수 없습니다.

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

    탭에서 x, y를 선택하세요. WHERE x = '키';
    SELECT x FROM 탭 WHERE x = '키' AND y < 42;

    그러나 이러한 쿼리는 다음을 수행할 수 없습니다.

    탭에서 x, z를 선택하세요. WHERE x = '키';
    SELECT x FROM 탭 WHERE x = '키' AND z < 42;

    (아래 설명된 것처럼 표현식 색인과 부분 색인은 이 규칙을 복잡하게 만듭니다.)

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

간단히 말하면, 두 가지 기본 요구 사항이 있는 경우 인덱스 전용 스캔이 가능하지만 테이블 힙 페이지의 상당 부분에 모두 표시되는 맵 비트가 설정된 경우에만 승리할 수 있습니다. 그러나 행의 대부분이 변경되지 않는 테이블은 실제로 이러한 유형의 스캔을 매우 유용하게 만들 만큼 일반적입니다.

윈 토토 전용 스캔 기능을 효과적으로 사용하려면 선행 열만 일치하도록 하는 윈 토토를 생성하도록 선택할 수 있습니다.어디절, 후행 열이 유지되는 동안페이로드쿼리로 반환될 데이터입니다. 예를 들어 일반적으로 다음과 같은 쿼리를 실행하는 경우

x = '키'인 탭에서 y를 선택하세요.

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

원칙적으로 윈 토토 전용 스캔은 표현식 윈 토토와 함께 사용할 수 있습니다. 예를 들어, 에 대한 윈 토토가 주어지면f(x)어디에서x테이블 열이므로 실행이 가능해야 합니다.

f(x) < 1인 탭에서 f(x)를 선택하세요.

색인 전용 스캔으로; 그리고 이것은 매우 매력적입니다.f()은 계산 비용이 많이 드는 함수입니다. 그러나PostgreSQL의 기획자는 현재 이러한 경우에 대해 그다지 현명하지 못합니다. 모든 경우에만 인덱스 전용 스캔을 통해 쿼리를 잠재적으로 실행할 수 있는 것으로 간주합니다.쿼리에 필요한 정보는 색인에서 확인할 수 있습니다. 이 예에서는,x컨텍스트를 제외하고는 필요하지 않습니다.f(x), 하지만 플래너는 이를 인지하지 못하고 윈 토토 전용 스캔이 불가능하다고 결론을 내립니다. 윈 토토 전용 스캔이 충분히 가치 있다고 판단되면 윈 토토를 on으로 선언하여 문제를 해결할 수 있습니다.(f(x), x), 여기서 두 번째 열은 실제로 사용될 것으로 예상되지 않지만 윈 토토 전용 스캔이 가능하다는 것을 플래너에게 확신시키기 위해 존재합니다. 재계산을 방지하는 것이 목표인 경우 추가 주의사항f(x), 플래너가 반드시의 용도와 일치하지는 않는다는 것입니다.f(x)색인 생성이 불가능함어디인덱스 열에 대한 절입니다. 일반적으로 위에 표시된 것과 같은 간단한 쿼리에서는 이 권한을 얻지만 조인을 포함하는 쿼리에서는 그렇지 않습니다. 이러한 결함은 향후 버전에서 해결될 수 있습니다.포스트그레SQL.

부분 색인은 색인 전용 스캔과도 흥미로운 상호작용을 합니다. 다음에 표시된 부분 인덱스를 고려하세요.예 11.3:

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

원칙적으로 다음과 같은 쿼리를 만족시키기 위해 이 색인에 대한 색인 전용 스캔을 수행할 수 있습니다.

주제 = 'some-subject' AND 성공인 테스트에서 대상 선택;

하지만 문제가 있습니다.어디절은 다음을 참조함성공윈 토토의 결과 열로 사용할 수 없습니다. 그럼에도 불구하고 계획에서 해당 부분을 다시 확인할 필요가 없기 때문에 윈 토토 전용 스캔이 가능합니다.어디런타임 시 절: 색인에서 발견된 모든 항목은 반드시성공 = 참따라서 이는 계획에서 명시적으로 확인할 필요가 없습니다.포스트그레SQL버전 9.6 이상에서는 이러한 경우를 인식하고 색인 전용 스캔 생성을 허용하지만 이전 버전에서는 그렇지 않습니다.