색인은 테이블의 두 개 이상의 열에 정의될 수 있습니다. 예를 들어, 다음 형식의 테이블이 있는 경우:
테이블 테스트2 생성( 주요 정수, 사소한 정수, 이름 varchar );
(예를 들어, 당신은 당신의 것을 유지합니다/dev데이터베이스의 디렉터리...) 다음과 같은 쿼리를 자주 실행합니다.
주요한 곳에서 test2에서 이름을 선택하세요 =상수AND 미성년자 =상수;
그러면 열에 색인을 정의하는 것이 적절할 수 있습니다전공그리고사소한함께, 예:
CREATE INDEX test2_mm_idx ON test2 (주요, 부);
현재 B-트리, GiST, GIN 및 BRIN 인덱스 유형만 다중 키 열 인덱스를 지원합니다. 여러 개의 키 열이 있을 수 있는지 여부는 다음과 무관합니다.포함열을 색인에 추가할 수 있습니다. 인덱스는 다음을 포함하여 최대 32개의 열을 가질 수 있습니다.포함열. (이 제한은 구축 시 변경될 수 있습니다.포스트그레SQL; 파일을 참조하세요pg_config_manual.h.)
다중 열 B-트리 인덱스는 인덱스 열의 하위 집합을 포함하는 쿼리 조건과 함께 사용할 수 있지만 선행(가장 왼쪽) 열에 제약 조건이 있을 때 인덱스가 가장 효율적입니다. 정확한 규칙은 선행 열에 대한 등식 제약 조건과 등식 제약 조건이 없는 첫 번째 열에 대한 부등식 제약 조건이 항상 스캔되는 인덱스 부분을 제한하는 데 사용된다는 것입니다. 이러한 열의 오른쪽에 있는 열에 대한 제약 조건은 인덱스에서 확인되므로 항상 해당 테이블에 대한 방문을 저장하지만 스캔해야 하는 인덱스 부분을 반드시 줄이지는 않습니다. B-트리 인덱스 스캔이 스킵 스캔 최적화를 효과적으로 적용할 수 있는 경우 반복된 인덱스 검색을 통해 인덱스를 탐색할 때 모든 열 제약 조건을 적용합니다. 이렇게 하면 하나 이상의 열(쿼리 조건자의 최하위 인덱스 열 이전)에 기존 동등 제약 조건이 없더라도 읽어야 하는 인덱스 부분이 줄어들 수 있습니다. 건너뛰기 스캔은 인덱스 열의 가능한 모든 값과 일치하는 동적 동등 제약 조건을 내부적으로 생성하여 작동합니다(단, 쿼리 조건자에서 제공되는 동등 제약 조건이 없는 열이 제공되고 생성된 제약 조건을 쿼리 조건자의 이후 열 제약 조건과 함께 사용할 수 있는 경우에만 해당).
예를 들어, 다음에 대한 색인이 주어지면(x, y)및 쿼리 조건어디에서 y = 7700, B-트리 토토 캔 스캔은 건너뛰기 스캔 최적화를 적용할 수 있습니다. 이는 일반적으로 쿼리 플래너가 반복될 것으로 예상할 때 발생합니다.여기서 x = N AND y = 7700가능한 모든 값을 검색합니다.N(또는 모든 경우x토토 캔에 실제로 저장된 값)은 테이블에서 사용 가능한 토토 캔를 고려할 때 가장 빠른 접근 방식입니다. 이 접근 방식은 일반적으로 고유한 항목이 거의 없는 경우에만 사용됩니다.x플래너가 스캔에서 대부분의 인덱스를 건너뛸 것으로 예상하는 값입니다(대부분의 리프 페이지에 관련 튜플이 포함될 수 없기 때문입니다). 별개의 것이 많은 경우x값을 사용하는 경우 전체 토토 캔를 스캔해야 하므로 대부분의 경우 플래너는 토토 캔를 사용하는 것보다 순차 테이블 스캔을 선호합니다.
스킵 스캔 최적화는 쿼리 조건자에서 최소한 몇 가지 유용한 제약 조건이 있는 B-트리 스캔 중에 선택적으로 적용될 수도 있습니다. 예를 들어, 에 대한 토토 캔가 주어지면(a, b, c)및 쿼리 조건a = 5 AND b = 42 AND c < 77인 경우, 토토 캔는를 사용하여 첫 번째 항목에서 스캔해야 할 수도 있습니다.a= 5 그리고b= 마지막 항목까지 42a= 5. 항목 색인 생성c= 77은 테이블 수준에서 필터링할 필요가 없지만 인덱스 내에서 건너뛰는 것이 수익성이 있을 수도 있고 그렇지 않을 수도 있습니다. 건너뛰기가 발생하면 스캔은 현재 끝에서 위치를 변경하기 위해 새로운 인덱스 검색을 시작합니다.a= 5 및b= N 그룹화(즉, 첫 번째 튜플이 있는 토토 캔의 위치에서a = 5 AND b = N AND c = 77나타남), 다음 그룹화의 시작 부분(즉, 첫 번째 튜플이 있는 인덱스의 위치a = 5 AND b = N + 1나타납니다).
다중 열 GiST 토토 캔는 토토 캔 열의 하위 집합과 관련된 쿼리 조건과 함께 사용할 수 있습니다. 추가 열의 조건은 토토 캔에서 반환되는 항목을 제한하지만 첫 번째 열의 조건은 스캔해야 하는 토토 캔의 양을 결정하는 데 가장 중요한 조건입니다. 추가 열에 고유 값이 많더라도 첫 번째 열에 고유 값이 몇 개만 있으면 GiST 토토 캔는 상대적으로 효과적이지 않습니다.
여러 열 GIN 토토 캔는 토토 캔 열의 하위 집합과 관련된 쿼리 조건과 함께 사용할 수 있습니다. B-tree나 GiST와 달리 쿼리 조건이 어떤 토토 캔 열을 사용하든 토토 캔 검색 효율성은 동일합니다.
다중 열 BRIN 토토 캔는 토토 캔 열의 하위 집합과 관련된 쿼리 조건과 함께 사용할 수 있습니다. GIN과 마찬가지로 B-tree나 GiST와는 달리 토토 캔 검색 효율성은 쿼리 조건이 사용하는 토토 캔 열에 관계없이 동일합니다. 단일 테이블에 하나의 다중 열 BRIN 토토 캔 대신 여러 BRIN 토토 캔를 갖는 유일한 이유는 다른 토토 캔를 갖기 위해서입니다.pages_per_range저장 매개변수.
물론, 각 열은 색인 유형에 적합한 연산자와 함께 사용되어야 합니다. 다른 연산자가 포함된 절은 고려되지 않습니다.
다중 열 색인은 자제해서 사용해야 합니다. 대부분의 상황에서는 단일 열의 토토 캔로 충분하며 공간과 시간이 절약됩니다. 3개 이상의 열이 있는 토토 캔는 테이블 사용법이 극도로 양식화되지 않는 한 도움이 되지 않을 것입니다. 또한 참조하세요PostgreSQL : 문서 : 17 : 11.5. 여러 윈 토토 결합그리고PostgreSQL : 문서 : 17 : 11.9. 스포츠 토토 사이트 전용 스캔 및 스포츠 토토 사이트 커버다양한 색인 구성의 장점에 대한 논의입니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.