Amcostestestimate 함수에는 클로스가있는 목록이 제공됩니다. 이는 인덱스로 사용할 수있는 것으로 결정되었습니다. 해야합니다 지수에 액세스 윈 토토과 위치의 선택성 (즉, 분수 인덱스 스캔 중에 검색되는 부모 테이블 행). 간단한 경우 윈 토토 추정기의 거의 모든 작업은 Optimizer에서 표준 루틴을 호출하여 수행해야합니다. 요점 Amcostestestimate 기능을 갖는 것은 인덱스 액세스를 허용하는 것입니다. 인덱스 유형 특이 적 지식을 제공하는 방법 표준 추정치를 개선 할 수 있습니다.
각 amcostestestime 함수는 서명이 있어야합니다 :
무효 amcostestestimate (plannerinfo *root, indexoptinfo *index, List *Indexquals, reploptinfo *outer_rel, Cost *IndexStartUpCost, 윈 토토 *IndextOtalCost, 선택성 *indexSelectivity, 이중 *색인 상관 관계);
처음 4 개의 매개 변수는 입력입니다 :
쿼리에 대한 플래너의 정보 가공.
고려중인 색인.
인덱스 Qual Clauses 목록 (암시 적으로 anded); NIL 목록은 예선을 사용할 수 없음을 나타냅니다. 주목하십시오 목록에는 스캔 키가 아닌 표현 나무가 포함되어 있습니다.
인덱스가 조인 내부에서 사용하도록 고려되는 경우 바깥쪽에 대한 플래너의 정보 인 indexscan 가입의. 그렇지 않으면 null. 널이 아닌 경우, 일부 Qual Clauses는이 REL과 함께 조항에 합류합니다. 간단한 제한 조항. 또한 윈 토토 추정기 각각에 대해 인덱스 스캔이 반복 될 것으로 예상해야합니다. 외부 rel.
마지막 4 개의 매개 변수는 회의 별 출력입니다 :
인덱스 스타트 업 프로세싱 윈 토토으로 설정
총 지수 처리 윈 토토으로 설정
인덱스 선택성으로 설정
인덱스 스캔 순서 사이의 상관 계수로 설정 그리고 기본 테이블의 주문
윈 토토 추정 기능은 C로 작성되어야합니다. SQL 또는 사용 가능한 절차 언어는 필요하기 때문입니다 플래너/최적화의 내부 데이터 구조에 액세스하십시오.
인덱스 액세스 윈 토토은 매개 변수를 사용하여 계산해야합니다. 사용SRC/백엔드/최적화/PATH/COSTIZE.C: a 순차 디스크 블록 페치 윈 토토이 듭니다SEQ_PAGE_COST, 비 순차적 인 페치는 윈 토토이 듭니다random_page_cost및 윈 토토 하나의 인덱스 행을 처리하는 것은 일반적으로로 취해야합니다.cpu_index_tuple_cost. 또한, 적절한 다중cpu_operator_cost인덱스 중에 호출 된 비교 연산자에 대해 청구됩니다 처리 (특히 indexquals 평가 그들 자신).
액세스 윈 토토에는 모든 디스크 및 CPU 윈 토토이 포함되어야합니다. 인덱스 자체를 스캔하는 것과 관련이 있지만아님검색 비용 또는 The에 의해 식별되는 부모 테이블 행을 처리합니다 색인.
the"시작 윈 토토"의 일부입니다 시작하기 전에 소비 해야하는 총 스캔 윈 토토 첫 번째 줄을 가져 오십시오. 대부분의 인덱스의 경우 이것은 0으로 사용할 수 있습니다. 그러나 시작 윈 토토이 높은 인덱스 유형은이를 설정할 수 있습니다. 0이 아닌.
indexselectivity는 추정 된 비율로 설정해야합니다 인덱스 중에 검색 될 상위 테이블 행 중 주사. 손실 쿼리의 경우 일반적으로 더 높을 것입니다. 실제로 주어진 Qual을 통과하는 행의 일부보다 정황.
색인 상관은 상관 관계로 설정되어야합니다 (범위 인덱스 순서와 테이블 사이의 -1.0과 1.0 사이 주문하다. 이것은 비용에 대한 추정치를 조정하는 데 사용됩니다. 상위 테이블에서 행을 가져 오기.
가입 케이스에서 반환 된 숫자는 평균이어야합니다. 지수를 한 번 스캔 할 것으로 예상됩니다.
윈 토토 추정
일반적인 윈 토토 추정기는 다음과 같이 진행됩니다 :
부모 테이블 행의 비율을 추정하고 반환합니다
주어진 Qual 조건에 따라 방문됩니다. ~ 안에
색인 유형 특이 적 지식이 없으면 사용하십시오
표준 최적화 기능clauselist_selectivity ()
:
*indexselectivity = clauselist_selectivity (root, indexquals, 색인- rel- 릴리드, join_inner, null);
방문 할 인덱스 행 수를 추정 스캔 중. 많은 인덱스 유형의 경우 이것은 동일합니다 IndexSelectivity는 인덱스의 행 수를 곱하지만 더 많을 수도 있습니다. (페이지의 인덱스 크기와 줄은 indexoptinfo struct에서 사용할 수 있습니다.)
할 인덱스 페이지 수를 추정하십시오 스캔 중에 검색되었습니다. 이것은 단지 일 수 있습니다 indexselectivity 페이지에서 인덱스 크기를 낭비합니다.
인덱스 액세스 윈 토토을 계산합니다. 일반적인 추정기가 될 수 있습니다 이렇게하십시오 :
/* * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다. * 순차적으로, 따라서 그들은 random_page_cost가 아닌 seq_page_cost가 각각 비용이 듭니다. * 또한 각 인덱스 행에서 Indexquals 평가를 청구합니다. * 모든 비용은 스캔 중에 점진적으로 지불되는 것으로 가정합니다. */ cost_qual_eval (& index_qual_cost, indexquals, root); *indexstartupcost = index_qual_cost.startup; * indextotalCost = seq_page_cost * numIndexpages + (cpu_index_tuple_cost + index_qual_cost.per_tuple) * numindextuples;
그러나 상기는 상각을 설명하지 않습니다 인덱스는 결합에서 반복 된 인덱스 스캔을 통해 읽습니다 사례.
인덱스 상관 관계를 추정합니다. 간단한 주문 단일 필드에서 색인, 이것은 검색 할 수 있습니다. PG_STATISTIC. 상관 관계를 알 수없는 경우 보수적 인 추정치는 0입니다 (상관 관계 없음).
윈 토토 추정기 기능의 예는에서 찾을 수 있습니다.src/backend/utils/adt/selfuncs.c.