| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 토토 핫 고유성 확인 | PostgreSQL : 문서 : 9.3 : 인덱스 메이저 토토 사이트 방법 인터페이스 정의 | 54장. 색인 액세스 방법 인터페이스 정의 | 토토 핫 : 문서 : 9.3 : 토토 핫 Indexes | |
그amcostestimate함수는
목록을 포함하여 가능한 인덱스 스캔을 설명하는 정보 제공
WHERE 및 ORDER BY 절의
인덱스와 함께 사용할 수 있습니다. 예상 비용을 반환해야 합니다.
WHERE 절의 인덱스 및 선택성에 액세스합니다.
이는 검색되는 동안 검색될 상위 테이블 행의 비율입니다.
인덱스 스캔). 간단한 경우에는 거의 모든 비용의 작업이 수행됩니다.
추정은 표준 루틴을 호출하여 수행할 수 있습니다.
최적화 프로그램; 의 요점은amcostestimate함수는 색인 액세스를 허용하는 것입니다
경우에 따라 인덱스 유형별 지식을 제공하는 방법
표준 추정치를 개선할 수 있습니다.
각각amcostestimate함수는 반드시
서명이 있습니다:
공허
amcostestimate(PlannerInfo *루트,
IndexPath *경로,
이중 루프_카운트,
비용 *indexStartupCost,
비용 *indexTotalCost,
선택성 *indexSelectivity,
double *indexCorrelation);
처음 세 매개변수는 입력입니다:
처리 중인 쿼리에 대한 플래너의 정보입니다.
색인 액세스 경로를 고려 중입니다. 비용을 제외한 모든 필드 선택성 값이 유효합니다.
인덱스 스캔의 반복 횟수 비용 견적에 반영됩니다. 이는 일반적으로 더 클 것입니다. 사용하기 위해 매개변수화된 스캔을 고려할 때 하나보다 Nestloop 조인 내부. 비용 견적은 다음과 같아야 합니다. 아직 한 번만 스캔하면 됩니다. 더 큰loop_count다음이 적절할 수 있음을 의미합니다. 여러 스캔에 걸쳐 일부 캐싱 효과를 허용합니다.
마지막 4개의 매개변수는 참조에 의한 전달 출력입니다:
인덱스 시작 처리 사설 토토으로 설정
인덱스 처리의 총 사설 토토으로 설정
색인 선택성으로 설정
인덱스 스캔 순서와 다음 사이의 상관 계수를 설정합니다. 기본 테이블의 순서
사설 토토 추정 기능은 C가 아닌 C로 작성되어야 한다는 점에 유의하세요. SQL 또는 사용 가능한 모든 절차적 언어(액세스해야 함) 플래너/옵티마이저의 내부 데이터 구조.
색인 액세스 사설 토토은 매개변수를 사용하여 계산되어야 합니다. 에서 사용됨src/backend/optimizer/path/costsize.c: 순차적 디스크 블록 가져오기에는 사설 토토이 발생함seq_page_cost, 비순차적 가져오기에는 사설 토토이 발생함random_page_cost및 처리 비용 인덱스 행은 일반적으로 다음과 같이 취해야 합니다.cpu_index_tuple_cost. 또한, 적절한 의 배수cpu_operator_cost이어야 합니다 인덱스 중에 호출된 비교 연산자에 대해 요금이 부과됩니다. 처리(특히 indexquals 평가 스스로).
액세스 사설 토토에는 모든 디스크 및 CPU 사설 토토이 포함되어야 합니다. 인덱스 자체를 스캔하는 것과 관련되어 있지만아님검색 비용 또는 다음으로 식별되는 상위 테이블 행을 처리합니다. 색인.
그"시작 사설 토토"다음의 일부입니다 시작하기 전에 지출해야 하는 총 스캔 비용 첫 번째 행을 가져옵니다. 대부분의 인덱스에서 이는 0으로 간주될 수 있습니다. 하지만 시작 비용이 높은 인덱스 유형에서는 이를 설정하는 것이 좋습니다. 0이 아닙니다.
그indexSelectivity다음으로 설정되어야 합니다. 상위 테이블 행의 예상 비율 인덱스 스캔 중에 검색되었습니다. 손실 쿼리의 경우 일반적으로 실제로 행의 비율보다 높을 것입니다. 주어진 조건을 통과합니다.
그색인상관다음으로 설정되어야 합니다. 지수 사이의 상관관계(-1.0에서 1.0 사이) 주문과 테이블 순서. 이는 추정치를 조정하는 데 사용됩니다. 상위 테이블에서 행을 가져오는 비용입니다.
언제loop_count1보다 큽니다. 반환된 숫자는 한 번의 스캔에 대해 예상되는 평균이어야 합니다. 색인의.
사설 토토 추정
일반적인 사설 토토 추정기는 다음과 같이 진행됩니다:
상위 테이블 행의 비율을 추정하고 반환합니다.
주어진 조건에 따라 방문하세요. 부재시
인덱스 유형별 지식이 있으면 표준 최적화 프로그램을 사용하세요.
기능clauselist_selectivity():
*indexSelectivity = 절 목록_선택(루트, 경로-indexquals,
경로-indexinfo-rel-relid,
JOIN_INNER, NULL);동안 방문할 인덱스 행 수를 추정합니다. 스캔. 많은 인덱스 유형의 경우 이는 다음과 동일합니다.indexSelectivity행의 수를 곱합니다. 색인이지만 더 많을 수도 있습니다. (인덱스의 페이지 크기는 행은에서 사용할 수 있습니다.경로-색인정보구조체.)
동안 검색될 색인 페이지 수를 추정합니다. 스캔. 이건 그냥 그럴 수도 있겠네요indexSelectivity인덱스 크기의 곱 페이지.
색인 액세스 비용을 계산하세요. 일반 추정기는 다음을 수행할 수 있습니다. 이:
/*
* 우리의 일반적인 가정은 색인 페이지를 읽는다는 것입니다.
* 순차적으로, 따라서 각각의 비용은 random_page_cost가 아닌 seq_page_cost입니다.
* 또한 각 인덱스 행의 indexquals 평가에 대한 비용도 청구됩니다.
* 모든 비용은 스캔하는 동안 점진적으로 지불되는 것으로 가정됩니다.
*/
cost_qual_eval(&index_qual_cost, 경로-indexquals, 루트);
*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.