이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 볼 수 있습니다current버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

19 장. 색인 토토 핫 추정 기능

저자 :Tom Lane ( 작성자)) on 2000-01-24

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

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

참고 :Postgres 7.0 이전에 다른 체계가있었습니다 지수 별 토토 핫 추정 등록에 사용됩니다 기능.

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

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

무효
amcostestestimate (query *root,
                reploptinfo *rel,
                indexoptinfo *index,
                List *Indexquals,
                Cost *IndexStartUpCost,
                토토 핫 *IndextOtalCost,
                selectivity *indexSelectivity);
처음 4 개의 매개 변수는 입력입니다 :
루트

처리중인 쿼리.

Rel

색인이 켜져 있습니다.

색인

인덱스 자체.

indexquals

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

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

*INDEXSTARTUPCOST

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

*IndextOtalCost

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

*indexSelectivity

인덱스 선택성으로 설정

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

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

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

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

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

토토 핫 추정

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

  1. 메인 테이블 튜플의 비율을 추정하고 반환합니다 주어진 Qual 조건에 따라 방문됩니다. ~ 안에 색인 유형 특이 적 지식이 없으면 사용하십시오 Standard Optimizer 함수 clauselist_selectivity () :

    *indexselectivity = clauselist_selectivity (root, indexquals,
                                               lfirsti (rel- relids);
  2. 방문 할 인덱스 튜플의 수를 추정 스캔 중. 많은 인덱스 유형의 경우 이것은 동일합니다 indexselectivity 인덱스의 튜플 수를 낭비하고 그러나 더 많을 수도 있습니다. (페이지의 인덱스 크기가 있습니다 그리고 튜플은 indexoptinfo struct에서 구할 수 있습니다.)

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

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

    /*
         * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다.
         * 순차적으로, 그들은 random_page_cost가 아닌 각각 1.0 달러입니다.
         * 또한 각 인덱스 튜플에서 Indexquals 평가를 청구합니다.
         * 모든 비용은 스캔 중에 점진적으로 지불되는 것으로 가정합니다.
         */
        *indexStartUpCost = 0;
        *IndextOtalCost = NumIndexPages +
            (cpu_index_tuple_cost + cost_qual_eval (indexquals)) * numindextuples;

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

컨벤션별PG_PROC입력amcostestimate함수해야합니다 보여주다

ProretType = 0
pronargs = 7
proargtypes = 0 0 0 0 0 0
우리는 모든 인수에 대해 0 ( "opaque")을 사용합니다. pg_type에서 알려진 유형이 있습니다.