이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

19장. 인덱스 토토 핫 추정 함수

저자:톰 레인 작성() 켜짐 2000-01-24

참고:이것은 결국 많은 것의 일부가 되어야 합니다 새로운 인덱스 액세스 방법 작성에 대한 더 큰 장을 참조하세요.

모든 색인 액세스 방법은 토토 핫 추정을 제공해야 합니다. 플래너/옵티마이저가 사용하는 함수입니다. 프로시저 OID 이 함수는amcostestimate액세스 방법 필드pg_am항목.

참고:Postgres 7.0 이전에는 다른 체계가 있었습니다. 지수별 토토 핫 추정 등록에 사용 기능.

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

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

공허
amcostestimate(쿼리 *root,
                RelOptInfo *rel,
                IndexOptInfo *색인,
                *indexQuals 나열,
                비용 *indexStartupCost,
                비용 *indexTotalCost,
                선택성 *indexSelectivity);
처음 4개의 매개변수는 입력입니다:
루트

쿼리를 처리 중입니다.

rel

색인이 있는 관계.

색인

색인 자체.

indexQuals

색인 qual 절 목록(암묵적으로 ANDed); NIL 목록에는 사용 가능한 한정자가 없음이 표시됩니다.

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

*indexStartupCost

인덱스 시작 처리 토토 핫으로 설정

*indexTotalCost

색인 처리의 총 비용으로 설정

*indexSelectivity

색인 선택성으로 설정

토토 핫 추정 기능은 C가 아닌 C로 작성되어야 한다는 점에 유의하십시오. SQL 또는 사용 가능한 모든 절차적 언어 플래너/옵티마이저의 내부 데이터 구조에 액세스합니다.

색인 액세스 비용은 다음에서 사용하는 단위로 계산되어야 합니다. src/backend/optimizer/path/costsize.c: 순차 디스크 블록 가져오기 비용은 1.0이고, 비순차적 가져오기 비용은 입니다. random_page_cost 및 인덱스 튜플 하나를 처리하는 데 드는 비용 일반적으로 cpu_index_tuple_cost로 취해야 합니다(이는 사용자가 조정할 수 있는 최적화 매개변수). 또한, 적절한 어떤 경우든 cpu_operator_cost의 배수가 청구되어야 합니다. 인덱스 처리 중에 호출되는 비교 연산자(특히 indexQuals 자체 평가).

액세스 비용에는 모든 디스크 및 CPU 비용이 포함되어야 합니다. 인덱스 자체 스캔과 관련이 있지만 비용은 발생하지 않습니다. 기본 테이블 튜플을 검색하거나 처리합니다. 색인으로 식별됩니다.

"시작 토토 핫"은 총 스캔 토토 핫의 일부입니다. 첫 번째 튜플을 가져오기 시작하기 전에 소비되어야 합니다. 대부분의 인덱스에서 이는 0으로 간주될 수 있지만 인덱스 유형은 초기 토토 핫이 높으면 0이 아닌 값으로 설정하는 것이 좋습니다.

indexSelectivity는 예상 비율로 설정되어야 합니다. 인덱스 중에 검색될 기본 테이블 튜플 스캔. 손실 인덱스의 경우 일반적으로 이 값이 더 높습니다. 주어진 Qual을 실제로 통과하는 튜플의 비율보다 조건.

토토 핫 추정

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

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

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

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

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

    /*
         * 우리의 일반적인 가정은 색인 페이지를 읽는다는 것입니다.
         * 순차적으로, 따라서 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항목 anamcostestimate함수는 다음과 같습니다 쇼

프로레트타입 = 0
pronargs = 7
proargtypes = 0 0 0 0 0 0 0
우리는 모든 인수에 대해 0("불투명")을 사용합니다. pg_type에 알려진 유형이 있습니다.