지원되지 않는 버전 :8.0 / 7.4 / 7.3 / 7.2 / 7.1
이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 동일한 페이지를 볼 수 있습니다현재버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

47 장. 색인 토토 베이 추정 기능

저자 :Tom Lane에 의해 작성 () 2000-01-24

참고 :이것은 결국 많은 부분이되어야합니다 새로운 인덱스 액세스 방법 작성에 관한 더 큰 장.

모든 인덱스 액세스 방법은 토토 베이 추정을 제공해야합니다 플래너/최적화기에서 사용하는 기능. 절차의 OID 이 기능은에 나와 있습니다.Amcostestimate액세스 방법의 필드PG_AMEntry.

참고 :이전postgresql7.0, 다른 체계 지수 별 토토 베이 추정 등록에 사용됩니다 기능.

AMCOSTESTESTIME 함수에는 클로스가있는 목록이 제공됩니다. 이는 인덱스로 사용할 수있는 것으로 결정되었습니다. 해야합니다 지수에 액세스 비용과 위치의 선택성 (즉, 분수 인덱스 스캔 중에 검색 될 메인 테이블 행). 간단한 경우 토토 베이 추정기의 거의 모든 작업은 Optimizer에서 표준 루틴을 호출하여 수행해야합니다. 요점 Amcostestestimate 기능을 갖는 것은 인덱스 액세스를 허용하는 것입니다. 인덱스 유형 특이 적 지식을 제공하는 방법 표준 추정치를 개선 할 수 있습니다.

각 amcostestestime 함수는 서명이 있어야합니다 :

무효
amcostestestimate (query *root,
                reploptinfo *rel,
                indexoptinfo *index,
                List *Indexquals,
                Cost *IndexStartUpCost,
                토토 베이 *IndextOtalCost,
                선택성 *indexSelectivity,
                이중 *색인 상관 관계);

처음 4 개의 매개 변수는 입력입니다 :

루트

처리중인 쿼리.

Rel

색인이 켜져 있습니다.

index

색인 자체.

indexquals

인덱스 Qual Clauses 목록 (암시 적으로 anded); NIL 목록은 예선을 사용할 수 없음을 나타냅니다.

마지막 4 개의 매개 변수는 회의 별 출력입니다 :

*INDEXSTARTUPCOST

인덱스 스타트 업 프로세싱 토토 베이으로 설정

*IndextOtalCost

총 지수 처리 토토 베이으로 설정

*indexSelectivity

인덱스 선택성으로 설정

*색인 상관 관계

인덱스 스캔 순서 사이의 상관 계수로 설정 그리고 기본 테이블의 주문

토토 베이 추정 기능은 C로 작성되어야합니다. SQL 또는 사용 가능한 절차 언어는 필요하기 때문입니다 플래너/최적화의 내부 데이터 구조에 액세스하십시오.

인덱스 액세스 토토 베이은에서 사용하는 단위로 계산해야합니다.SRC/백엔드/최적화/PATH/COSTIZE.C: 순차 디스크 블록 페치의 비용은 1.0, 비 순차 페치입니다. random_page_cost의 비용과 하나의 인덱스 처리 비용이 있습니다. 행은 일반적으로 cpu_index_tuple_cost로 취해야합니다 ( 사용자 조정 가능한 Optimizer 매개 변수). 또한, 적절한 CPU_OPERATOR_COST의 여러 가지 요금이 청구되어야합니다 인덱스 처리 중 비교 연산자 (특히 indexquals 자체 평가).

액세스 토토 베이에는 모든 디스크 및 CPU 토토 베이이 포함되어야합니다. 인덱스 자체를 스캔하는 것과 관련이 있지만 토토 베이은 식별 된 메인 테이블 행을 검색하거나 처리합니다 인덱스에 의해.

the"시작 토토 베이"의 일부입니다 시작하기 전에 소비 해야하는 총 스캔 토토 베이 첫 번째 줄을 가져 오십시오. 대부분의 인덱스의 경우 이것은 0으로 사용할 수 있습니다. 그러나 시작 토토 베이이 높은 인덱스 유형은이를 설정할 수 있습니다. 0이 아닌.

indexselectivity는 추정 된 비율로 설정해야합니다 인덱스 중에 검색 될 메인 테이블 행 중 주사. 손실 인덱스의 경우 일반적으로 더 높을 것입니다. 실제로 주어진 Qual을 통과하는 행의 일부보다 정황.

색인 상관은 상관 관계로 설정되어야합니다 (범위 인덱스 순서와 테이블 사이의 -1.0과 1.0 사이 주문하다. 이것은 토토 베이에 대한 추정치를 조정하는 데 사용됩니다. 메인 테이블에서 행을 가져 오는 것.

토토 베이 추정

일반적인 토토 베이 추정기는 다음과 같이 진행됩니다 :

  1. 메인 테이블 행의 비율을 추정하고 반환합니다 주어진 품질 조건에 따라 방문됩니다. 에서 색인 유형 특이 적 지식이 없으면 사용하십시오 표준 최적화 기능clauselist_selectivity ():

    *indexselectivity = clauselist_selectivity (root, indexquals,
                                               rel- relid, join_inner);
  2. 방문 할 인덱스 행 수를 추정 스캔 중. 많은 인덱스 유형의 경우 이것은 동일합니다 IndexSelectivity는 인덱스의 행 수를 곱하지만 더 많을 수도 있습니다. (페이지의 인덱스 크기와 줄은 indexoptinfo struct에서 사용할 수 있습니다.)

  3. 할 인덱스 페이지 수를 추정하십시오 스캔 중에 검색되었습니다. 이것은 단지 일 수 있습니다 indexselectivity 페이지에서 인덱스 크기를 낭비합니다.

  4. 인덱스 액세스 토토 베이을 계산합니다. 일반적인 추정기가 될 수 있습니다 이렇게하십시오 :

    /*
         * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다.
         * 순차적으로, 그들은 random_page_cost가 아닌 각각 1.0 달러입니다.
         * 또한 각 인덱스 행에서 Indexquals 평가를 청구합니다.
         * 모든 비용은 스캔 중에 점진적으로 지불되는 것으로 가정합니다.
         */
        cost_qual_eval (& index_qual_cost, indexquals);
        *indexstartupcost = index_qual_cost.startup;
        *IndextOtalCost = NumIndexPages +
            (cpu_index_tuple_cost + index_qual_cost.per_tuple) * numindextuples;
  5. 인덱스 상관 관계를 추정합니다. 간단한 주문 단일 필드에서 색인, 이것은 검색 할 수 있습니다. PG_STATISTIC. 상관 관계를 알 수없는 경우 보수적 인 추정치는 0입니다 (상관 관계 없음).

토토 베이 추정기 기능의 예는에서 찾을 수 있습니다.src/backend/utils/adt/selfuncs.c.

컨벤션별PG_PROC입장Amcostestimate함수가 표시되어야합니다 8 개의 주장은 모두로 선언된다.내부(SQL에 알려진 유형이 없기 때문에) 반환 유형은void.