이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 62.6. 색인 토토 핫 추정 기능버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

50.6. 지수 윈 토토 추정 기능

amcostestimate 함수에는 WHERE 절 목록이 제공됩니다 인덱스와 함께 사용할 수 있도록 결정된 것입니다. 반드시 인덱스 액세스 윈 토토에 대한 추정치를 반환하고 WHERE 절의 선택성(즉, 인덱스 스캔 중에 검색될 상위 테이블 행). 간단한 경우에는 윈 토토추정자의 거의 모든 작업이 가능합니다. 최적화 프로그램에서 표준 루틴을 호출하여 수행됩니다. 요점 amcostestimate 함수를 사용하면 인덱스 액세스를 허용할 수 있습니다. 경우에 따라 인덱스 유형별 지식을 제공하는 방법 표준 추정치를 개선할 수 있습니다.

각 amcostestimate 함수에는 서명이 있어야 합니다.

공허
amcostestimate(PlannerInfo *루트,
                IndexOptInfo *색인,
                *indexQuals 나열,
                RelOptInfo *outer_rel,
                윈 토토 *indexStartupCost,
                윈 토토 *indexTotalCost,
                선택성 *indexSelectivity,
                double *indexCorrelation);

처음 4개의 매개변수는 입력입니다:

루트

질의에 대한 기획자의 정보는 다음과 같습니다. 처리되었습니다.

색인

색인을 고려 중입니다.

indexQuals

색인 한정절 목록(암묵적으로 ANDed); NIL 목록에는 사용 가능한 한정자가 없음이 표시됩니다. 참고 목록에는 ScanKeys가 아닌 표현식 트리가 포함되어 있습니다.

outer_rel

색인이 내부 조인에 사용되도록 고려되는 경우 indexscan, 플래너의 바깥쪽 정보 조인의. 그렇지 않으면 NULL입니다. NULL이 아닌 경우 일부는 qual 절은 이 rel과의 조인 절이 됩니다. 단순한 제한 조항입니다. 또한 비용추정자는 인덱스 스캔이 각각에 대해 반복될 것으로 예상해야 합니다. 외부 상대의 행.

마지막 4개의 매개변수는 참조에 의한 전달 출력입니다:

*indexStartupCost

색인 시작 처리 비용으로 설정

*indexTotalCost

색인 처리 총 비용으로 설정

*indexSelectivity

색인 선택성으로 설정

*색인 상관관계

인덱스 스캔 순서 사이의 상관 계수로 설정 및 기본 테이블의 순서

윈 토토 추정 기능은 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는 예상 분수로 설정되어야 합니다. 인덱스 중에 검색될 상위 테이블 행 스캔. 손실이 있는 쿼리의 경우 일반적으로 이 값이 더 높습니다. 주어진 품질을 실제로 통과하는 행의 비율보다 조건.

indexCorrelation은 상관관계(범위 지정)로 설정되어야 합니다. -1.0에서 1.0 사이) 인덱스 순서와 테이블 사이 주문. 이는 윈 토토 추정치를 조정하는 데 사용됩니다. 상위 테이블에서 행을 가져옵니다.

조인의 경우 반환된 숫자는 평균이어야 합니다 인덱스를 한 번 스캔할 때마다 예상됩니다.

윈 토토 추정

일반적인 윈 토토 추정기는 다음과 같이 진행됩니다:

  1. 상위 테이블 행의 비율을 추정하고 반환합니다. 주어진 Qual 조건에 따라 방문됩니다. 에서 인덱스 유형별 지식이 없으면 다음을 사용하십시오. 표준 최적화 기능clauselist_selectivity():

    *indexSelectivity = 절 목록_선택(루트, indexQuals,
                                               인덱스-rel-relid,
                                               JOIN_INNER, NULL);
  2. 방문할 인덱스 행 수 추정 스캔하는 동안. 많은 인덱스 유형의 경우 이는 다음과 동일합니다. indexSelectivity는 인덱스의 행 수를 곱하지만 그 이상일 수도 있습니다. (색인의 페이지 크기와 행은 IndexOptInfo 구조체에서 사용할 수 있습니다.)

  3. 색인 페이지 수를 추정하세요. 스캔 중에 검색되었습니다. 이건 그냥 그럴수도 있지 indexSelectivity는 페이지 단위의 인덱스 크기를 곱한 값입니다.

  4. 색인 액세스 비용을 계산합니다. 일반 추정기는 다음과 같습니다. 이렇게 하세요:

    /*
         * 우리의 일반적인 가정은 색인 페이지를 읽는다는 것입니다.
         * 순차적으로, 따라서 각각의 비용은 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;

    그러나 위의 내용은 상각을 고려하지 않습니다. 조인에서 반복되는 인덱스 스캔에 대한 인덱스 읽기 경우.

  5. 지수 상관관계를 추정합니다. 간단하게 주문하려면 단일 필드의 인덱스는 다음에서 검색할 수 있습니다. pg_statistic. 상관관계를 알 수 없는 경우, 보수적 추정치는 0입니다(상관관계 없음).

윈 토토 추정 기능의 예는 다음에서 찾을 수 있습니다.src/backend/utils/adt/selfuncs.c.