저자 :Tom Lane에 의해 작성 (
<tgl@sss.pgh.pa.us
) 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 개의 매개 변수는 입력입니다 :
처리중인 쿼리.
색인이 켜져 있습니다.
색인 자체.
인덱스 Qual Clauses 목록 (암시 적으로 anded); NIL 목록은 예선을 사용할 수 없음을 나타냅니다.
마지막 4 개의 매개 변수는 회의 별 출력입니다 :
인덱스 스타트 업 프로세싱 토토 베이으로 설정
총 지수 처리 토토 베이으로 설정
인덱스 선택성으로 설정
인덱스 스캔 순서 사이의 상관 계수로 설정 그리고 기본 테이블의 주문
토토 베이 추정 기능은 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 사이 주문하다. 이것은 토토 베이에 대한 추정치를 조정하는 데 사용됩니다. 메인 테이블에서 행을 가져 오는 것.
토토 베이 추정
일반적인 토토 베이 추정기는 다음과 같이 진행됩니다 :
메인 테이블 행의 비율을 추정하고 반환합니다
주어진 품질 조건에 따라 방문됩니다. 에서
색인 유형 특이 적 지식이 없으면 사용하십시오
표준 최적화 기능clauselist_selectivity ()
:
*indexselectivity = clauselist_selectivity (root, indexquals, rel- relid, join_inner);
방문 할 인덱스 행 수를 추정 스캔 중. 많은 인덱스 유형의 경우 이것은 동일합니다 IndexSelectivity는 인덱스의 행 수를 곱하지만 더 많을 수도 있습니다. (페이지의 인덱스 크기와 줄은 indexoptinfo struct에서 사용할 수 있습니다.)
할 인덱스 페이지 수를 추정하십시오 스캔 중에 검색되었습니다. 이것은 단지 일 수 있습니다 indexselectivity 페이지에서 인덱스 크기를 낭비합니다.
인덱스 액세스 토토 베이을 계산합니다. 일반적인 추정기가 될 수 있습니다 이렇게하십시오 :
/* * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다. * 순차적으로, 그들은 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;
인덱스 상관 관계를 추정합니다. 간단한 주문 단일 필드에서 색인, 이것은 검색 할 수 있습니다. PG_STATISTIC. 상관 관계를 알 수없는 경우 보수적 인 추정치는 0입니다 (상관 관계 없음).
토토 베이 추정기 기능의 예는에서 찾을 수 있습니다.src/backend/utils/adt/selfuncs.c.
컨벤션별PG_PROC입장Amcostestimate함수가 표시되어야합니다 8 개의 주장은 모두로 선언된다.내부(SQL에 알려진 유형이 없기 때문에) 반환 유형은void.