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

11.9. 색인 전용 스캔 및 포함 색인

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

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

  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;

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

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

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

색인 전용 스캔 기능을 효과적으로 사용하려면 다음을 생성하도록 선택할 수 있습니다.표지 색인는 자주 실행하는 특정 유형의 쿼리에 필요한 열을 포함하도록 특별히 설계된 사설 토토 사이트입니다. 쿼리는 일반적으로 검색한 열보다 더 많은 열을 검색해야 하므로,PostgreSQL일부 열이 포함된 사설 토토 사이트를 생성할 수 있습니다.페이로드그리고 검색 키의 일부가 아닙니다. 이는를 추가하여 수행됩니다.포함추가 열을 나열하는 절입니다. 예를 들어 일반적으로 다음과 같은 쿼리를 실행하는 경우

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

이러한 쿼리 속도를 높이는 전통적인 접근 방식은 다음에 대한 색인을 생성하는 것입니다.x전용. 그러나 다음과 같이 정의된 인덱스는

탭(x) 포함(y)에 인덱스 tab_x_y 생성;

이러한 쿼리를 색인 전용 스캔으로 처리할 수 있습니다. 왜냐하면y힙을 방문하지 않고 색인에서 얻을 수 있습니다.

열 때문에y은 사설 토토 사이트 검색 키의 일부가 아니며 사설 토토 사이트가 처리할 수 있는 데이터 유형일 필요는 없습니다. 이는 단지 사설 토토 사이트에 저장될 뿐이며 사설 토토 사이트 기계에 의해 해석되지 않습니다. 또한, 사설 토토 사이트가 고유 사설 토토 사이트인 경우, 즉

탭(x) 포함(y)에 고유 인덱스 tab_x_y 생성;

고유성 조건은 열에만 적용됩니다.x, 다음의 조합이 아님x그리고y. (안포함절은 다음으로도 작성할 수 있습니다.고유그리고기본 키제약조건, 이와 같은 색인을 설정하기 위한 대체 구문을 제공합니다.)

키가 아닌 페이로드 열, 특히 넓은 열을 인덱스에 추가하는 것에 대해서는 보수적인 것이 현명합니다. 인덱스 튜플이 인덱스 유형에 허용되는 최대 크기를 초과하면 데이터 삽입이 실패합니다. 어떤 경우든 키가 아닌 열은 인덱스 테이블의 데이터를 복제하고 인덱스 크기를 늘리므로 검색 속도가 느려질 수 있습니다. 그리고 인덱스 전용 스캔이 힙에 액세스할 필요가 없을 정도로 테이블이 느리게 변경되지 않는 한 인덱스에 페이로드 열을 포함하는 것은 거의 의미가 없다는 점을 기억하십시오. 어쨌든 힙 튜플을 방문해야 하는 경우 거기에서 열 값을 가져오는 데 비용이 더 들지 않습니다. 다른 제한 사항은 표현식이 현재 포함 열로 지원되지 않으며 현재 B-트리 인덱스만 포함 열을 지원한다는 점입니다.

이전PostgreSQL그는포함기능, 페이로드 열을 일반 인덱스 열로 작성하여 커버링 인덱스를 만드는 경우가 있었습니다. 즉, 쓰기

탭(x, y)에 tab_x_y 사설 토토 사이트 생성;

비록 그들은 사용할 의도가 없었지만ya의 일부로어디절. 추가 열이 후행 열인 한 이는 잘 작동합니다. 이를 선행 열로 만드는 것은 다음에 설명된 이유로 현명하지 않습니다.PostgreSQL : 문서 : 11 : 11.3. 멀티 컬럼 스포츠 토토 사이트. 그러나 이 방법은 인덱스가 키 열에 고유성을 적용하도록 하려는 경우를 지원하지 않습니다. 또한 검색할 수 없는 열을 다음과 같이 명시적으로 표시합니다.포함열은 색인을 약간 더 작게 만듭니다. 왜냐하면 이러한 열은 상위 B-트리 수준에 저장될 필요가 없기 때문입니다.

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

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

색인 전용 스캔으로; 그리고 이것은 매우 매력적입니다.f()은 계산 비용이 많이 드는 함수입니다. 하지만,포스트그레SQL의 기획자는 현재 이러한 경우에 대해 그다지 현명하지 못합니다. 모든 경우에만 인덱스 전용 스캔을 통해 쿼리를 잠재적으로 실행할 수 있는 것으로 간주합니다.쿼리에 필요한 정보는 색인에서 확인할 수 있습니다. 이 예에서는,x컨텍스트를 제외하고는 필요하지 않습니다.f(x), 플래너는 이를 인지하지 못하고 인덱스 전용 스캔이 불가능하다는 결론을 내립니다. 인덱스 전용 스캔이 충분히 가치 있다고 판단되면 다음을 추가하여 해결할 수 있습니다.x포함된 열로, 예를 들어

탭에 인덱스 tab_f_x 생성(f(x)) 포함(x);

재계산을 방지하는 것이 목표인 경우 추가 주의사항f(x), 플래너가 반드시의 용도와 일치하지는 않는다는 것입니다.f(x)색인 생성이 가능하지 않은어디인덱스 열에 대한 절입니다. 일반적으로 위에 표시된 것과 같은 간단한 쿼리에서는 이 권한을 얻지만 조인을 포함하는 쿼리에서는 그렇지 않습니다. 이러한 결함은 향후 버전에서 해결될 수 있습니다.PostgreSQL.

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

CREATE UNIQUE INDEX 테스트_success_constraint ON 테스트(주제, 대상)
    어디에서 성공;

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

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

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