theAMCOSTESTESTIME
함수는 인덱스와 함께 사용할 수있는 것으로 판단 된 조항의 위치 및 순서 목록을 포함하여 가능한 색인 스캔을 설명하는 정보가 제공됩니다. 인덱스에 액세스하는 비용과 위치 조항의 선택성에 대한 추정치를 반환해야합니다 (즉, 인덱스 스캔 중에 검색 될 부모 테이블 행의 비율). 간단한 경우, 최적화에서 표준 루틴을 호출하여 토토 캔 추정기의 거의 모든 작업을 수행 할 수 있습니다. 의 요점amcostestimate
함수는 표준 추정치를 개선 할 수있는 경우 인덱스 액세스 방법을 색인 유형 특유의 지식을 제공 할 수 있도록하는 것입니다..
각AMCOSTESTESTIME
함수는 서명이 있어야합니다 :
무효 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
인덱스 처리 중에 호출 된 비교 연산자 (특히 인덱스 자체 평가)에 대해 청구해야합니다.
액세스 토토 캔에는 인덱스 자체를 스캔하는 것과 관련된 모든 디스크 및 CPU 토토 캔이 포함되어야하지만not색인에 의해 식별되는 부모 테이블 행을 검색하거나 처리하는 토토 캔.
the“시작 토토 캔”첫 번째 행을 가져 오기 전에 소비 해야하는 총 스캔 비용의 일부입니다. 대부분의 인덱스의 경우 이것은 0으로 사용할 수 있지만 시작 토토 캔이 높은 인덱스 유형은 0이 아닌 설정을 원할 수 있습니다.
theindexSelectivity
인덱스 스캔 중에 검색 될 상위 테이블 행의 추정 비율로 설정해야합니다. 손실 된 쿼리의 경우 일반적으로 주어진 Qual 조건을 실제로 통과하는 행의 일부보다 높을 것입니다..
theindexcorrelation
는 인덱스 순서와 테이블 순서 사이에서 상관 관계 (-1.0과 1.0 사이)로 설정되어야합니다. 이것은 부모 테이블에서 행을 가져 오는 토토 캔에 대한 견적을 조정하는 데 사용됩니다.
theindexpages
잎 페이지 수로 설정해야합니다. 이것은 병렬 인덱스 스캔의 작업자 수를 추정하는 데 사용됩니다.
언제loop_count
1보다 크고, 반환 된 숫자는 지수를 한 번 스캔 할 때 예상되는 평균이어야합니다.
토토 캔 추정
일반적인 토토 캔 추정기는 다음과 같이 진행됩니다 :
주어진 Qual 조건에 따라 방문 될 부모 테이블 행의 비율을 추정하고 반환합니다. 인덱스 유형 특정 지식이 없으면 표준 최적화 기능을 사용하십시오clauselist_selectivity ()
:
*indexselectivity = clauselist_selectivity (root, path- indexquals, path- indexinfo- rel- 릴리드, join_inner, null);
스캔 중에 방문 할 인덱스 행의 수를 추정하십시오. 많은 인덱스 유형의 경우 이것은와 동일합니다.indexSelectivity
인덱스의 행 수를 횟수로 설정하지만 더 많을 수도 있습니다. (페이지와 행의 인덱스 크기는에서 사용할 수 있습니다.path- indexinfo
struct.)
스캔 중에 검색 될 인덱스 페이지 수를 추정하십시오. 이것은 단지indexSelectivity
페이지에서 인덱스 크기를 시간에 타십시오.
인덱스 액세스 토토 캔을 계산합니다. 일반적인 추정기가 이것을 할 수 있습니다 :
/* * 우리의 일반적인 가정은 인덱스 페이지를 읽을 것입니다. * 순차적으로, 따라서 그들은 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;
그러나 위의 내용은 반복 된 인덱스 스캔을 통해 인덱스 판독의 상각을 설명하지 않습니다.
지수 상관을 추정합니다. 단일 필드의 간단한 주문 인덱스의 경우 PG_STATISTIC에서 검색 할 수 있습니다. 상관 관계를 알 수없는 경우 보수적 인 추정치는 0입니다 (상관 관계 없음).
토토 캔 추정기 기능의 예는에서 찾을 수 있습니다.src/backend/utils/adt/selfuncs.c
.
문서에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면