저자 :Tom Lane ( 작성자)<tgl@sss.pgh.pa.us) 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 개의 매개 변수는 입력입니다 :
처리중인 쿼리.
색인이 켜져 있습니다.
인덱스 자체.
인덱스 Qual Clauses 목록 (암시 적으로 anded); NIL 목록은 예선을 사용할 수 없음을 나타냅니다.
마지막 3 개의 매개 변수는 회의 별 출력입니다 :
인덱스 스타트 업 프로세싱 토토 핫으로 설정
총 지수 처리 토토 핫으로 설정
인덱스 선택성으로 설정
토토 핫 추정 기능은 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을 통과하는 튜플의 일부보다 정황.
토토 핫 추정
일반적인 토토 핫 추정기는 다음과 같이 진행됩니다 :
메인 테이블 튜플의 비율을 추정하고 반환합니다 주어진 Qual 조건에 따라 방문됩니다. ~ 안에 색인 유형 특이 적 지식이 없으면 사용하십시오 Standard Optimizer 함수 clauselist_selectivity () :
*indexselectivity = clauselist_selectivity (root, indexquals, lfirsti (rel- relids);
방문 할 인덱스 튜플의 수를 추정 스캔 중. 많은 인덱스 유형의 경우 이것은 동일합니다 indexselectivity 인덱스의 튜플 수를 낭비하고 그러나 더 많을 수도 있습니다. (페이지의 인덱스 크기가 있습니다 그리고 튜플은 indexoptinfo struct에서 구할 수 있습니다.)
할 인덱스 페이지 수를 추정하십시오 스캔 중에 검색되었습니다. 이것은 단지 일 수 있습니다 indexselectivity 페이지에서 인덱스 크기를 낭비합니다.
인덱스 액세스 토토 핫을 계산합니다. 일반적인 추정기가 될 수 있습니다 이렇게하십시오 :
/* * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다. * 순차적으로, 그들은 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에서 알려진 유형이 있습니다.