11.8. 부분 토토 결과

a부분 토토 결과| 테이블의 하위 집합에 구축 된 토토 결과입니다. 서브 세트는 조건부 표현식으로 정의됩니다 (술어10628_10836

부분 토토 결과을 사용하는 주요 이유 중 하나는 공통 값을 색인화하지 않도록하는 것입니다. 공통 값 (모든 테이블 행의 몇 % 이상을 차지하는 값)을 검색하는 쿼리는 어쨌든 인덱스를 사용하지 않기 때문에 인덱스에 해당 행을 전혀 보관하는 점이 없습니다. 이렇게하면 인덱스의 크기가 줄어들어 인덱스를 사용하는 쿼리 속도가 빨라집니다. 또한 모든 경우에 인덱스를 업데이트 할 필요는 없기 때문에 많은 테이블 업데이트 작업 속도를 높입니다.예 11.1이 아이디어의 적용을 보여줍니다.

예 11.1. 공통 값을 제외하기 위해 부분 토토 결과 설정

데이터베이스에 웹 서버 액세스 로그를 저장한다고 가정합니다. 대부분의 액세스는 조직의 IP 주소 범위에서 비롯되지만 일부는 다른 곳에서 나옵니다 (예 : 전화 접속 연결 직원). IP의 검색이 주로 외부 액세스를위한 경우 조직의 서브넷에 해당하는 IP 범위를 토토 결과 할 필요가 없을 것입니다.

다음과 같은 테이블을 가정합니다 :

테이블 생성 access_log (
    URL VAR토토 결과AR,
    client_ip inet,
    ...
);

우리의 예에 맞는 부분 토토 결과을 만들려면 다음과 같은 명령을 사용하십시오.

access_log (client_ip)에서 index access_log_client_ip_ix 만들기
(client_ip inet '192.168.100.0'및
           client_ip <inet '192.168.100.255');

이 토토 결과을 사용할 수있는 일반적인 쿼리는 다음과 같습니다.

선택 *
Access_Log에서
여기서 url = '/index.html'및 client_ip = inet '212.78.10.32';

여기서 쿼리의 IP 주소는 부분 토토 결과으로 덮여 있습니다. 다음 쿼리는 인덱스에서 제외 된 IP 주소를 사용하므로 부분 토토 결과을 사용할 수 없습니다.

선택 *
Access_Log에서
여기서 url = '/index.html'및 client_ip = inet '192.168.100.23';

이러한 종류의 부분 토토 결과은 공통 값을 미리 결정해야하므로 이러한 부분 토토 결과은 변경되지 않는 데이터 분포에 가장 잘 사용됩니다. 이러한 인덱스는 때때로 새로운 데이터 분포를 조정하기 위해 재현 될 수 있지만 유지 보수 노력이 추가됩니다.


부분 인덱스에 대한 또 다른 사용은 일반적인 쿼리 워크로드가 관심이없는 인덱스에서 값을 제외하는 것입니다. 이것은에 표시됩니다.예 11.2. 이로 인해 위에 나열된 것과 동일한 장점이 있지만를 방지합니다.무관심이 경우 인덱스 스캔이 수익성이 있더라도 해당 인덱스를 통해 액세스하는 값. 분명히, 이러한 종류의 시나리오에 대한 부분 토토 결과을 설정하면 많은 관리 및 실험이 필요합니다.

예 11.2. 흥미롭지 않은 값을 제외하기 위해 부분 토토 결과 설정

청구되지 않은 명령과 달리지 않은 주문이 모두 포함 된 테이블이있는 경우, 미지급 명령이 총 테이블의 작은 부분을 차지하지만 가장 인정받은 행으로, 달리지 않은 행에서만 인덱스를 만들어 성능을 향상시킬 수 있습니다. 토토 결과을 생성하라는 명령은 다음과 같습니다.

주문에서 토토 결과 orders_unbilled_index 만들기 (Order_nr)
    청구가 사실이 아닌 곳;

이 토토 결과을 사용할 수있는 쿼리는 다음과 같습니다.

선택 * 청구 된 명령에서 청구 된 명령에서 rebliced <10000;

그러나 인덱스는 포함되지 않는 쿼리에서도 사용할 수 있습니다Order_nr전혀, 예를 들어 :

선택 * 청구 된 명령에서 청구 된 명령에서 금액이 5000.00;

이것은의 부분 토토 결과만큼 효율적이지 않습니다.금액컬럼은 시스템이 전체 인덱스를 스캔해야하므로입니다. 그러나, 달리지 않은 명령이 상대적으로 거의 없다면,이 부분 지수를 사용하여 달리지 않은 주문을 찾기 위해서는 승리가 될 수 있습니다.

이 쿼리는이 토토 결과을 사용할 수 없습니다.

Orders에서 Order_nr = 3501;에서 선택 * 선택 *

명령 3501은 청구되거나 달리지 않은 명령 중 하나 일 수 있습니다.


예 11.2또한 술어에 사용 된 인덱스 열과 열이 일치 할 필요가 없음을 보여줍니다.PostgreSQL인덱싱되는 테이블의 열만 관련된 한 임의의 사전 상사가있는 부분 인덱스를 지원합니다. 그러나 술어는 색인의 혜택을받을 수있는 쿼리에 사용 된 조건과 일치해야합니다. 정확하게 말하면, 시스템이 쿼리에서만 쿼리에서 부분 인덱스를 사용할 수 있습니다.여기서쿼리의 조건은 수학적으로 색인의 술어를 암시합니다.PostgreSQL다른 형태로 작성된 수학적으로 동등한 표현을 인식 할 수있는 정교한 정리 속담이 없습니다. (이러한 일반적인 이론 속도는 생성하기가 매우 어려울뿐만 아니라 실제로 사용하기에는 너무 느릴 것입니다.)이 시스템은 간단한 불평등의 영향을 인식 할 수 있습니다 (예 :x <1암시x <2; 그렇지 않으면 술어 조건은 쿼리의 일부와 정확히 일치해야합니다여기서조건 또는 인덱스는 사용 가능한 것으로 인식되지 않습니다. 일치하는 것은 실행 시간이 아닌 쿼리 계획 시간에서 이루어집니다. 결과적으로, 매개 변수화 된 쿼리 클로는 부분 토토 결과과 함께 작동하지 않습니다. 예를 들어 매개 변수가있는 준비된 쿼리가 지정할 수 있습니다x <?결코 암시하지 않을 것입니다x <2매개 변수의 가능한 모든 값에 대해.

부분 인덱스에 대한 세 번째 사용은 인덱스를 쿼리로 전혀 사용하지 않아도됩니다. 여기서 아이디어는와 같이 테이블의 하위 집합에 대한 고유 한 인덱스를 만드는 것입니다.예 11.3. 이것은 인덱스 술어를 만족시키는 행 사이의 고유성을 시행하고, 그렇지 않은 것을 제한하지 않고..

예 11.3. 부분 고유 인덱스 설정

테스트 결과를 설명하는 테이블이 있다고 가정하십시오. 우리는 단지 하나만 있는지 확인하고 싶습니다성공주어진 주제 및 대상 조합에 대한 입력이지만 수가 있습니다.실패항목. 다음은 다음과 같은 방법입니다.

테이블 테스트 생성 (
    제목 텍스트,
    대상 텍스트,
    성공 부울,
    ...
);

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

이것은 성공적인 테스트가 거의없고 실패한 많은 테스트가있을 때 특히 효율적인 접근법입니다. AN으로 고유 한 부분 토토 결과을 만들어 열에서 하나의 널 만 허용 할 수도 있습니다.is null제한.


마지막으로, 부분 토토 결과을 사용하여 시스템의 쿼리 계획 선택을 무시할 수도 있습니다. 또한 독특한 배포판이있는 데이터 세트로 인해 시스템이 실제로는 안되는 경우 인덱스를 사용하게 될 수 있습니다. 이 경우 인덱스는 불쾌한 쿼리에 사용할 수 없도록 설정할 수 있습니다. 보통,PostgreSQL인덱스 사용에 대해 합리적인 선택을합니다 (예 : 공통 값을 검색 할 때 피하기 때문에 초기 예제는 실제로 인덱스 크기 만 저장되므로 인덱스 사용을 피할 필요는 없습니다), 심하게 잘못된 계획 선택은 버그 보고서의 원인입니다..

부분 토토 결과을 설정하면 쿼리 플래너가 알고있는 것만 큼 적어도 알고 있음을 명심하십시오. 특히 인덱스가 언제 수익성이 있는지 알고 있습니다. 이 지식을 형성하려면 인덱스의 지수에 대한 경험과 이해가 필요합니다.PostgreSQL작업. 대부분의 경우 일반 색인에 대한 부분 토토 결과의 장점은 최소화됩니다. 그들이 매우 비생산적인 경우가 있습니다.예 11.4.

예 11.4. 부분 토토 결과을 분할 대신 대체물로 사용하지 마십시오

예를 들어 겹치지 않는 부분 인덱스 세트를 만들고 싶은 유혹을받을 수 있습니다

MyTable (데이터)에서 mytable_cat_1을 생성하십시오. 여기서 범주 = 1;
mytable (data)에서 index mytable_cat_2를 만듭니다. 여기서 범주 = 2;
mytable (data)에서 색인 mytable_cat_3을 만듭니다. 여기서 범주 = 3;
...
색인 생성 mytable_cat_nON MYTABLE (데이터) 여기서 범주 =n;

이것은 나쁜 생각입니다! 거의 확실하게, 당신은 단일 비 당면 지수로 더 나은 것과 같은

mytable에서 mytable_cat_data 생성 (카테고리, 데이터);

PostgreSQL : 문서 : 13 : 11.3. 멀티 컬럼 스포츠 토토.)이 더 큰 지수의 검색은 더 작은 인덱스에서 검색보다 더 많은 트리 레벨을 통해 내려 가야 할 수도 있지만, 적절한 부분 인덱스를 선택하는 데 필요한 플래너 노력보다 거의 저렴할 것입니다. 문제의 핵심은 시스템이 부분 인덱스 간의 관계를 이해하지 못하고 현재 쿼리에 적용되는지 확인하기 위해 각각을 힘들게 테스트한다는 것입니다..

테이블이 단일 토토 결과이 실제로 나쁜 아이디어 일 정도로 큰 경우, 대신 파티션을 사용해야합니다 (참조사설 토토 사이트 PostgreSQL : 문서 : 13 : 5.11. 테이블 파티셔닝). 이러한 메커니즘을 통해 시스템은 테이블과 인덱스가 겹치지 않음을 이해하고 훨씬 더 나은 성능이 가능하다는 것을 이해합니다.


부분 토토 결과에 대한 자세한 내용은 찾을 수 있습니다.[STON89B], [olson93][Seshadri95].

수정 제출

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