11.8. 스포츠 토토 결과 색인

A 스포츠 토토 결과 색인테이블의 하위 집합에 구축 된 색인입니다. 서브 세트는 조건부 표현식으로 정의됩니다 (술어10443_10648

스포츠 토토 결과 인덱스를 사용하는 주요 이유 중 하나는 공통 값을 색인화하지 않는 것입니다. 공통 값 (모든 테이블 행의 몇 % 이상을 차지하는 값)을 검색하는 쿼리는 어쨌든 인덱스를 사용하지 않기 때문에 인덱스에 해당 행을 전혀 보관하는 점이 없습니다.예 11.1이 아이디어의 적용 가능성을 보여줍니다.

예 11.1. 공통 값을 제외하기 위해 스포츠 토토 결과 색인 설정

데이터베이스에 웹 서버 액세스 로그를 저장한다고 가정합니다. 대스포츠 토토 결과의 액세스는 조직의 IP 주소 범위에서 비롯되지만 일부는 다른 곳에서 나옵니다 (예 : 전화 접속 연결 직원).

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

테이블 생성 access_log (

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

access_log (client_ip)에서 index access_log_client_ip_ix 만들기

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

선택 *

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

선택 *

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


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

예 11.2. 흥미롭지 않은 값을 제외하기 위해 스포츠 토토 결과 색인 설정

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

주문에서 색인 작성 _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. 부분 고유 인덱스 설정

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

테이블 테스트 생성 (

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


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

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

예 11.4. 스포츠 토토 결과 색인을 분할 대신 대체물로 사용하지 마십시오

예를 들어 겹치지 않는 스포츠 토토 결과 인덱스 세트를 만들려고 유혹을받을 수 있습니다

mytable (data)에서 mytable_cat_1을 생성하십시오. 여기서 범주 = 1;NMyTable에서 (데이터) 범주 =N;

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

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

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

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


스포츠 토토 결과 색인에 대한 자세한 내용은 참조 할 수 있습니다.[STON89B], [olson93][Seshadri95].

정정 제출

문서에 맞지 않는 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면