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