62.6. 색인 토토 캔 추정 기능

theAMCOSTESTESTIME함수는 인덱스와 함께 사용할 수있는 것으로 결정된 조항의 위치 및 순서 목록을 포함하여 가능한 색인 스캔을 설명하는 정보가 제공됩니다. 인덱스에 액세스하는 비용과 위치 조항의 선택성에 대한 추정치를 반환해야합니다 (즉, 인덱스 스캔 중에 검색 될 부모 테이블 행의 비율). 간단한 경우, 최적화에서 표준 루틴을 호출하여 토토 캔 추정기의 거의 모든 작업을 수행 할 수 있습니다. 의 요점AMCOSTESTESTIME함수는 표준 추정치를 개선 할 수있는 경우 인덱스 액세스 방법을 색인 유형 특유의 지식을 제공 할 수 있도록하는 것입니다.

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

무효
amcostestestimate (plannerinfo *root,
                IndexPath *Path,
                더블 루프 _count,
                Cost *IndexStartUpCost,
                토토 캔 *IndextOtalCost,
                선택성 *indexSelectivity,
                이중 *색인 상관,
                Double *indexpages);

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

루트

처리중인 쿼리에 대한 플래너의 정보.

PATH

인덱스 액세스 경로가 고려됩니다. 토토 캔 및 선택성 값을 제외한 모든 필드는 유효합니다.

loop_count

토토 캔 추정치에 포함되어야하는 인덱스 스캔의 반복 수. 이것은 NestLoop 조인 내부에서 사용하기 위해 매개 변수화 된 스캔을 고려할 때 일반적으로 1보다 클 것입니다. 토토 캔 추정치는 여전히 단 하나의 스캔에 대한 것이어야합니다. 더 큰loop_count여러 스캔에서 일부 캐싱 효과를 허용하는 것이 적절할 수 있음을 의미합니다.

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

*INDEXSTARTUPCOST

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

*IndextOtalCost

총 지수 처리 토토 캔으로 설정

*indexSelectivity

인덱스 선택성으로 설정

*색인 상관

인덱스 스캔 순서와 기본 테이블 순서 사이의 상관 계수로 설정

*indexpages

인덱스 리프 페이지 수로 설정

토토 캔 추정 기능은 Planner/Optimizer의 내부 데이터 구조에 액세스해야하기 때문에 SQL이 아닌 C로 작성되어야합니다..

인덱스 액세스 토토 캔은에 사용 된 매개 변수를 사용하여 계산해야합니다.SRC/백엔드/최적화/PATH/COSTIZE.C: 순차 디스크 블록 페치 토토 캔이 듭니다seq_page_cost, 비 순차적 인 페치는 토토 캔이 듭니다random_page_cost, 그리고 하나의 인덱스 행을 처리하는 토토 캔은 일반적으로로 취해야합니다.cpu_index_tuple_cost. 또한 적절한 배수의cpu_operator_cost인덱스 처리 중에 호출 된 비교 연산자에 대해 청구되어야합니다 (특히 indexquals 자체 평가).

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

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

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

the색인 상관 관계는 인덱스 순서와 테이블 순서 사이에서 상관 관계 (-1.0과 1.0 사이)로 설정해야합니다. 이것은 부모 테이블에서 행을 가져 오는 토토 캔에 대한 견적을 조정하는 데 사용됩니다.

theindexpages잎 페이지 수로 설정해야합니다. 이것은 병렬 인덱스 스캔의 작업자 수를 추정하는 데 사용됩니다.

언제loop_count1보다 크고, 반환 된 숫자는 지수를 한 번 스캔 할 때 예상되는 평균이어야합니다.

토토 캔 추정

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

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

    *indexselectivity = clauselist_selectivity (root, path- indexquals,
                                               path- indexinfo- rel- 릴리드,
                                               join_inner, null);
  2. 스캔 중에 방문 할 인덱스 행 수를 추정하십시오. 많은 인덱스 유형의 경우 이것은와 동일합니다.indexSelectivity인덱스의 행 수를 시간에 맞추지 만 더 많을 수도 있습니다. (페이지와 행의 인덱스 크기는에서 사용할 수 있습니다.path- indexinfostruct.)

  3. 스캔 중에 검색 될 인덱스 페이지 수를 추정하십시오. 이것은 단지indexSelectivity페이지에서 인덱스의 크기를 시간에 타기.

  4. ​​인덱스 액세스 토토 캔을 계산합니다. 일반적인 추정기가 이것을 할 수 있습니다 :

    /*
     * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다.
     * 순차적으로, 따라서 그들은 random_page_cost가 아닌 seq_page_cost가 각각 비용이 듭니다.
     * 또한 각 인덱스 행에서 Indexquals 평가를 청구합니다.
     * 모든 비용은 스캔 중에 점진적으로 지불되는 것으로 가정합니다.
     */
    cost_qual_eval (& index_qual_cost, path- indexquals, root);
    *indexstartupcost = index_qual_cost.startup;
    * indextotalCost = seq_page_cost * numIndexpages +
        (cpu_index_tuple_cost + index_qual_cost.per_tuple) * numindextuples;

    그러나 위의 내용은 반복 된 인덱스 스캔을 통해 인덱스 판독의 상각을 설명하지 않습니다.

  5. 인덱스 상관 관계를 추정합니다. 단일 필드의 간단한 주문 인덱스의 경우 PG_STATISTIC에서 검색 할 수 있습니다. 상관 관계를 알 수없는 경우 보수적 인 추정치는 0입니다 (상관 관계 없음).

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

정정 제출

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