A 토토 결과 색인| 테이블의 하위 집합에 구축 된 색인입니다. 서브 세트는 조건부 표현식으로 정의됩니다 (술어10492_10697
토토 결과 인덱스를 사용하는 주요 이유 중 하나는 공통 값을 색인화하지 않도록하는 것입니다. 공통 값 (모든 테이블 행의 몇 % 이상을 차지하는 값)을 검색하는 쿼리는 어쨌든 인덱스를 사용하지 않기 때문에 인덱스에 해당 행을 전혀 보관하는 점이 없습니다.예 11.1이 아이디어의 적용 가능성을 보여줍니다.
예 11.1. 공통 값을 제외하기 위해 토토 결과 색인 설정
데이터베이스에 웹 서버 액세스 로그를 저장한다고 가정합니다. 대토토 결과의 액세스는 조직의 IP 주소 범위에서 비롯되지만 일부는 다른 곳에서 나옵니다 (예 : 전화 접속 연결 직원).
다음과 같은 테이블을 가정합니다.
테이블 생성 access_log (
우리의 예에 맞는 토토 결과 색인을 만들려면 다음과 같은 명령을 사용하십시오.
access_log (client_ip)에서 index access_log_client_ip_ix 만들기
이 색인을 사용할 수있는 일반적인 쿼리는 다음과 같습니다.
선택 *
여기서 쿼리의 IP 주소는 토토 결과 색인으로 덮여 있습니다. 다음 쿼리는 인덱스에서 제외 된 IP 주소를 사용하므로 토토 결과 색인을 사용할 수 없습니다.
선택 *
이러한 종류의 토토 결과 색인은 공통 값을 미리 결정해야하므로 이러한 토토 결과 색인은 변경되지 않는 데이터 분포에 가장 잘 사용됩니다. 이러한 인덱스는 때때로 새로운 데이터 분포를 조정하기 위해 재현 될 수 있지만 유지 보수 노력이 추가됩니다.
토토 결과 색인에 대한 또 다른 사용은 일반적인 쿼리 워크로드가 관심이 없다는 인덱스에서 값을 제외하는 것입니다. 이것은에 표시됩니다.예 11.2. 이로 인해 위에 나열된 것과 동일한 장점이 있지만를 방지합니다.“무관심”해당 인덱스를 통해 액세스하는 값은이 경우 인덱스 스캔이 수익성이있을 수 있습니다. 분명히, 이러한 종류의 시나리오에 대한 토토 결과 색인을 설정하면 많은 관리 및 실험이 필요합니다.
예 11.2. 흥미롭지 않은 값을 제외하기 위해 토토 결과 색인 설정
청구되지 않은 명령과 달리지 않은 주문이 모두 포함 된 테이블이있는 경우, 미지급 명령이 총 테이블의 작은 부분을 차지하지만 가장 접근 된 행이 가장 많이 사용되면, 달리지 않은 행에서만 인덱스를 만들어 성능을 향상시킬 수 있습니다. 색인을 생성하라는 명령은 다음과 같습니다.
주문에서 색인 orders_unbild_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;N
mytable (data)에서 카테고리 =N
;
이것은 나쁜 생각입니다! 거의 확실하게, 당신은 단일 비 당면 지수로 더 나은 것과 같은
mytable에서 mytable_cat_data 생성 (카테고리, 데이터);
PostgreSQL : 문서 : 13 : 11.3. 멀티 컬럼 스포츠 토토.)이 큰 인덱스에서 검색이 더 작은 인덱스에서 검색보다 더 많은 트리 레벨을 통해 내려 가야 할 수도 있지만, 적절한 부분 인덱스를 선택하는 데 필요한 플래너 노력보다 거의 저렴할 것입니다. 문제의 핵심은 시스템이 부분 인덱스 간의 관계를 이해하지 못하고 현재 쿼리에 적용되는지 확인하기 위해 각각을 힘들게 테스트한다는 것입니다..
테이블이 단일 색인이 실제로 나쁜 아이디어 일 정도로 크면 대신 파티션을 사용해야합니다 (참조사설 토토 사이트 PostgreSQL : 문서 : 13 : 5.11. 테이블 파티셔닝). 이러한 메커니즘을 통해 시스템은 테이블과 인덱스가 겹치지 않음을 이해하고 훨씬 더 나은 성능이 가능하다는 것을 이해합니다.
토토 결과 인덱스에 대한 자세한 내용은 참조 할 수 있습니다.[STON89B], [olson93]및[Seshadri95].
19328_19522이 양식문서 문제를보고하려면