모든 색인PostgreSQLareSecondary무지개 토토 - 각 무지개 토토가 테이블의 주요 데이터 영역과 별도로 저장됨을 의미합니다 (테이블이라고합니다.힙inPostgreSQL용어). 이는 일반적인 무지개 토토 스캔에서 각 행 검색은 무지개 토토와 힙 모두에서 데이터를 가져 오는 것이 필요하다는 것을 의미합니다.여기서
조건은 일반적으로 무지개 토토에서 함께 가깝고, 참조하는 테이블 행은 힙의 어느 곳에도있을 수 있습니다. 따라서 무지개 토토 스캔의 힙 액세스 부분은 힙에 많은 임의의 접근을 포함하며, 특히 전통적인 회전 매체에서 느릴 수 있습니다.섹션 11.5, 비트 맵 스캔은 정렬 된 순서로 힙 액세스를 수행 하여이 비용을 완화 시키려고하지만 지금까지만 진행됩니다.)
이 성능 문제를 해결하려면PostgreSQL지원무지개 토토 전용 스캔, 힙 액세스없이 무지개 토토만으로 쿼리에 응답 할 수 있습니다. 기본 아이디어는 관련 힙 항목에 상담하는 대신 각 무지개 토토 항목에서 값을 직접 반환하는 것입니다.
인덱스 유형은 무지개 토토 전용 스캔을 지원해야합니다. B- 트리 색인은 항상 그렇습니다.
쿼리는 무지개 토토에 저장된 열만 참조해야합니다. 예를 들어, 열에 대한 색인이 주어지면x
andy
열이있는 테이블의z
,이 쿼리는 무지개 토토 전용 스캔을 사용할 수 있습니다 :
x = '키'에서 x, y를 선택합니다.
그러나이 쿼리는 다음과 같습니다.
X = '키'에서 X, Z를 선택합니다.
(표현 무지개 토토 및 부분 색인은 아래에서 논의 된 대로이 규칙을 복잡하게합니다.)
이 두 가지 기본 요구 사항이 충족되면 쿼리에서 요구하는 모든 데이터 값은 색인에서 사용할 수 있으므로 무지개 토토 전용 스캔이 물리적으로 가능합니다. 그러나 모든 테이블 스캔에 대한 추가 요구 사항이 있습니다.PostgreSQL: 검색 된 각 행이임을 확인해야합니다.“가시적”Query의 MVCC 스냅 샷으로PostgreSQL : 문서 : 16 : 13 장. 메이저 토토 사이트 제어. 가시성 정보는 무지개 토토 항목에 저장되지 않으며 힙 항목에만 저장됩니다.PostgreSQL트랙, 테이블 힙의 각 페이지마다 해당 페이지에 저장된 모든 행이 모든 현재 및 미래의 트랜잭션에 볼 수있을 정도로 오래되었는지 여부를 추적합니다. 이 정보는 테이블에 약간 저장됩니다가시성 맵. 무지개 토토 전용 스캔은 후보 인덱스 항목을 찾은 후 해당 힙 페이지의 가시성 맵 비트를 확인합니다.
간단히 말해서, 두 가지 기본 요구 사항을 고려할 때 무지개 토토 전용 스캔이 가능하지만 테이블 힙 페이지의 상당 부분에 가시 가능한 맵 비트가 설정된 경우에만 승리됩니다. 그러나 행의 많은 부분이 변하지 않는 테이블은 이러한 유형의 스캔을 실제로 매우 유용하게 만들기에 충분히 일반적입니다.
무지개 토토 전용 스캔 기능을 효과적으로 사용하려면 A를 작성하도록 선택할 수 있습니다커버링 무지개 토토는 자주 실행하는 특정 유형의 쿼리에 필요한 열을 포함하도록 특별히 설계된 색인입니다. 일반적으로 쿼리는 검색하는 것보다 더 많은 열을 검색해야하므로PostgreSQL일부 열이 단지 무지개 토토를 만들 수 있습니다“Payload”검색 키의 일부가 아닙니다. 이것은 in을 추가하여 수행됩니다포함
조항 추가 열을 나열합니다. 예를 들어, 일반적으로 Queries와 같은 쿼리를 실행하면
탭에서 y를 선택하여 x = '키';
그러한 쿼리 속도를 높이기위한 전통적인 접근 방식은 in 인덱스를 만드는 것입니다x
만. 그러나로 정의 된 색인
탭 (x) include (y);에서 index tab_x_y 만들기
이 쿼리를 무지개 토토 전용 스캔으로 처리 할 수 있습니다.y
힙을 방문하지 않고 무지개 토토에서 얻을 수 있습니다.
열y
| 무지개 토토 검색 키의 일부가 아니며 무지개 토토가 처리 할 수있는 데이터 유형 일 필요는 없습니다. 그것은 단지 무지개 토토에 저장되며 무지개 토토 기계에 의해 해석되지 않습니다.
탭 (x) include (y);에서 고유 인덱스 탭 탭 탭 생성
고유성 조건은 단지 열에 적용됩니다x
x
andy
. (an포함
조항도 작성할 수 있습니다고유 한
and기본 키
이와 같은 색인을 설정하기위한 대체 구문 제공 제약 조건.)
비키 페이로드 열을 무지개 토토, 특히 넓은 열에 추가하는 것이 보수적 인 것이 좋습니다. 무지개 토토 튜플이 무지개 토토 유형에 허용되는 최대 크기를 초과하면 데이터 삽입이 실패합니다.
전PostgreSQL포함
기능, 사람들은 때때로 페이로드 열을 일반 무지개 토토 열로 작성하여 무지개 토토를 다루었습니다.
탭 (x, y)에서 index tab_x_y 만들기;
사용 할 의도는 없지만y
a의 일부로여기서
절. 여분의 열이 후행 열이면 잘 작동합니다.섹션 11.3. 그러나이 방법은 인덱스가 키 열의 고유성을 시행 할 예정인 경우를 지원하지 않습니다.
접미사 잘림항상 상부 B- 트리 레벨에서 비 키 열을 제거합니다. 페이로드 열로 무지개 토토 스캔을 안내하는 데 사용되지 않습니다.포함
절은 종종 상위 레벨에 효과적으로 페이로드되는 열을 저장하지 않습니다. 그러나 페이로드 열을 비 키 열로 명시 적으로 정의확실하게튜플을 상부 레벨로 유지합니다.
원칙적으로 무지개 토토 전용 스캔을 표현 인덱스와 함께 사용할 수 있습니다. 예를 들어, 인덱스가 주어지면f (x)
여기서x
테이블 열이므로 실행할 수 있어야합니다
탭에서 f (x) <1;에서 f (x)를 선택합니다.
무지개 토토 전용 스캔으로서; 그리고 이것은 매우 매력적입니다f()
는 비용이 많이 드는 기능입니다. 하지만,PostgreSQL의 플래너는 현재 그러한 경우에 대해 그다지 똑똑하지 않습니다. 쿼리가 모든 경우에만 무지개 토토 전용 스캔을 통해 잠재적으로 실행할 수있는 것으로 간주합니다.열12227_12293x
상황을 제외하고는 필요하지 않습니다f (x)
, 그러나 플래너는이를 알지 못하고 무지개 토토 전용 스캔이 불가능하다는 결론을 내립니다. 무지개 토토 전용 스캔이 충분히 가치있는 것처럼 보이면 추가하여 해결할 수 있습니다x
포함 된 열로
탭에서 index tab_f_x 만들기 (f (x)) 포함 (x);
추가 경고, 목표가 재 계산을 피하는 것이라면f (x)
, 플래너가 반드시의 사용과 일치 할 필요는 없다는 것입니다.f (x)
색인이 없어여기서
색인 열로의 조항. 일반적으로 위에 표시된 것과 같은 간단한 쿼리 로이 제대로됩니다.PostgreSQL.
부분 인덱스는 또한 무지개 토토 전용 스캔과 흥미로운 상호 작용을 가지고 있습니다. 에 표시된 부분 색인을 고려하십시오.예 11.3:
고유 인덱스 생성 테스트 _success_constraint tests (주제, 대상)
원칙적으로, 우리는이 색인에 대한 색인 전용 스캔을 수행하여 쿼리를 만족시킬 수 있습니다
주제 = 'some-subject'및 success; 테스트에서 대상을 선택하십시오.
그러나 문제가 있습니다 :여기서
조항은성공
인덱스의 결과 열로 사용할 수 없습니다. 그럼에도 불구하고, 계획이 해당 부분을 다시 확인할 필요가 없기 때문에 무지개 토토 전용 스캔이 가능합니다.여기서
실행 시간의 조항 : 무지개 토토에있는 모든 항목이 반드시 가지고 있습니다성공 = true
따라서 계획에서 명시 적으로 확인할 필요는 없습니다.PostgreSQL버전 9.6 이상은 그러한 경우를 인식하고 무지개 토토 전용 스캔을 생성 할 수 있지만 이전 버전은 그렇지 않습니다..
문서에 올바른 것이 없다면 일치하지 않습니다.이 양식문서 문제를보고하려면