11.9. 토토 커뮤니티 전용 스캔 및 토토 커뮤니티 커버#

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

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

  1. 인덱스 유형은 토토 커뮤니티 전용 스캔을 지원해야합니다. B- 트리 색인은 항상 그렇습니다. GIST 및 SP-GIST 인덱스는 일부 운영자 클래스의 토토 커뮤니티 전용 스캔을 지원하지만 다른 작업은 아닙니다. 다른 인덱스 유형은 지원하지 않습니다. 기본 요구 사항은 인덱스가 각 인덱스 항목의 원래 데이터 값을 물리적으로 저장하거나 재구성 할 수 있어야한다는 것입니다. 반면에, GIN 인덱스는 각 인덱스 항목이 일반적으로 원래 데이터 값의 일부만 보유하기 때문에 토토 커뮤니티 전용 스캔을 지원할 수 없습니다.

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

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

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

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

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

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

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

토토 커뮤니티 전용 스캔 기능을 효과적으로 사용하려면 A를 작성하도록 선택할 수 있습니다커버링 토토 커뮤니티는 자주 실행하는 특정 유형의 쿼리에 필요한 열을 포함하도록 특별히 설계된 색인입니다. 일반적으로 쿼리는 검색하는 것보다 더 많은 열을 검색해야하므로postgresql일부 열이 단지 토토 커뮤니티를 만들 수 있습니다Payload검색 키의 일부가 아닙니다. 이것은 in을 추가하여 수행됩니다포함추가 열을 나열하는 조항. 예를 들어, 일반적으로 Queries와 같은 쿼리를 실행하면

x = '키'; 탭에서 y를 선택하십시오.

그러한 쿼리 속도를 높이기위한 전통적인 접근 방식은 토토 커뮤니티를 생성하는 것입니다x만. 그러나로 정의 된 색인

탭 (x) include (y);에 인덱스 탭 생성 탭 탭 ab_x_y

이 쿼리를 토토 커뮤니티 전용 스캔으로 처리 할 수 ​​있습니다.y힙을 방문하지 않고 토토 커뮤니티에서 얻을 수 있습니다.

Columny토토 커뮤니티 검색 키의 일부가 아니며 토토 커뮤니티가 처리 할 수있는 데이터 유형 일 필요는 없습니다. 그것은 단지 토토 커뮤니티에 저장되며 토토 커뮤니티 기계에 의해 해석되지 않습니다. 또한 토토 커뮤니티가 고유 한 토토 커뮤니티 인 경우

탭 (x) include (y);에서 고유 인덱스 탭 탭 탭 생성

고유성 조건은 단지 열에 적용됩니다xxandy. (an포함조항도 작성할 수 있습니다15528_15536and기본 키이와 같은 색인을 설정하기위한 대체 구문 제공 제약 조건.)

지수, 특히 넓은 열에 비 키로드 열을 추가하는 것이 보수적 인 것이 좋습니다. 인덱스 튜플이 인덱스 유형에 허용되는 최대 크기를 초과하면 데이터 삽입이 실패합니다. 어쨌든, 비 키 열은 인덱스 테이블에서 데이터를 복제하고 인덱스 크기를 부풀려서 검색이 느려질 수 있습니다. 또한 토토 커뮤니티 전용 스캔이 힙에 액세스 할 필요가 없을 정도로 테이블이 천천히 변경되지 않는 한 인덱스에 페이로드 열을 포함시키는 것은 거의 없음을 기억하십시오. 힙 튜플을 어쨌든 방문 해야하는 경우, 그곳에서 열의 가치를 얻는 데 더 많은 비용이 들지 않습니다. 다른 제한 사항은 표현이 현재 포함 된 열로 지원되지 않으며 B- 트리, GIST 및 SP-GIST 인덱스 만 현재 포함 된 열을 지원한다는 것입니다.

PostgreSQL포함기능, 사람들은 때때로 페이로드 열을 일반 토토 커뮤니티 열로 작성하여 토토 커뮤니티를 다루었습니다.

탭 (x, y);에서 토토 커뮤니티 탭 생성 탭 탭 탭 _x_y

비록 그들이 사용하려는 의도가 없더라도ya의 일부로여기서절. 여분의 열이 후행 열이면 잘 작동합니다. 다음을 선도하는 열로 만드는 이유는에 설명 된 이유 때문에PostgreSQL : 문서 : 17 : 11.3. 멀티 컬럼 윈 토토. 그러나이 방법은 인덱스가 키 열의 고유성을 시행 할 예정인 경우를 지원하지 않습니다.

접미사 잘림항상 상부 B- 트리 레벨에서 비 키 열을 제거합니다. 페이로드 열로 토토 커뮤니티 스캔을 안내하는 데 사용되지 않습니다. 자르기 프로세스는 또한 키 컬럼의 나머지 접두사가 가장 낮은 B- 트리 레벨에서 튜플을 설명하기에 충분한 경우 하나 이상의 후행 키 열 (들)을 제거합니다. 실제로,없이 토토 커뮤니티를 다루고 있습니다.포함조항은 종종 상위 레벨에서 효과적으로 페이로드되는 열을 저장하지 않습니다. 그러나 페이로드 열을 비 키 열로 명시 적으로 정의확실하게튜플을 상부 레벨로 유지합니다.

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

탭에서 f (x) <1;에서 f (x)를 선택하십시오.

토토 커뮤니티 전용 스캔; 그리고 이것은 매우 매력적입니다f ()는 비용이 많이 드는 기능입니다. 하지만,PostgreSQL의 플래너는 현재 그러한 경우에 대해 그다지 똑똑하지 않습니다. 쿼리가 모든 경우에만 토토 커뮤니티 전용 스캔을 통해 잠재적으로 실행할 수있는 것으로 간주합니다.18630_18700x상황을 제외하고는 필요하지 않습니다f (x), 그러나 플래너는이를 알지 못하고 토토 커뮤니티 전용 스캔이 불가능하다는 결론을 내립니다. 토토 커뮤니티 전용 스캔이 충분히 가치있는 것처럼 보이면 추가하여 해결할 수 있습니다x포함 된 열로

탭에서 index tab_f_x 만들기 (f (x)) 포함 (x);

추가 경고, 목표가 재 계산을 피하는 것이라면f (x), 플래너가 반드시의 사용과 일치 할 필요는 없다는 것입니다.f (x)색인이없는 것은여기서색인 열로의 조항. 일반적으로 위에 표시된 것과 같은 간단한 쿼리 로이 제대로됩니다. 이러한 결함은 향후 |PostgreSQL.

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

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

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

20150_20222

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

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면