이 문서는 지원되지 않는 버전의 토토을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 68.1. 행 윈 토토 예버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

55.1. 행 토토

아래 표시된 예제는에 테이블을 사용합니다.토토회귀 테스트 데이터베이스. 그만큼분석생산하는 동안 랜덤 샘플링을 사용합니다분석.

매우 간단한 쿼리로 시작합시다 :

설명을 설명하십시오 * -1 | |에서;

플래너가 카디널리티를 결정하는 방법-1 | |섹션 14.2이지만 여기에서 반복됩니다pg_class:

relname = 'tenk1'인 pg_class에서 relpages, reltuples를 선택하십시오.

이 숫자는 마지막으로 최신입니다진공또는분석onRelpagesthereltuples에 따라 a에 도달하도록 스케일링됩니다Reltuples.

범위 조건이있는 예로 넘어 가자여기서절 :

select * tenk1 where 1 <1-1 |-1 |-1 |;

플래너는를 검사합니다.여기서<inpg_operator. 이것은 열에 보관됩니다Oprrest및이 경우 항목Scalarltsel. 그만큼Scalarltsel함수는 히스토그램을 검색합니다고유 1FromPG_STATISTICS. 수동 쿼리의 경우 더 많습니다PG_STATS보기 :

PG_STATS에서 histogram_bounds를 선택하십시오

다음에 의해 점유 된 히스토그램의 분획"<1-1 |-1 |-1 |"가 해결되었습니다. 이것은입니다partall

selectivity = (1 + (1-1 |-1 |-1 |- 버킷 [2] .min)/(버킷 [2] .max -bucket [2] .min))/num_buckets

즉, 하나의 전체 버킷과 선형 분율-1 | |:

rows = rel_cardinality * 선택성

다음 평등 조건이있는 예를 고려해 봅시다.여기서절 :

StringU1 = 'craaaa'에서 tenk1에서 선택 *을 선택하십시오.

다시 플래너가를 검사합니다여기서조항 조건 및 선택성 함수를 찾아=,eqsel. 평등 토토의 경우 히스토그램은입니다가장 일반적입니다(MCVs)는 익숙합니다

n_distinct |, n_distinct, most_common_vals, most_common_freqs pg_stats를 선택하십시오

이후Craaaa목록에 나타납니다MCFs) :

선택성 = MCF [3]

이전과 마찬가지로, 추정 수의 행은 단지-1 | |:

행 = 1-1 |-1 |-1 |-1 | * -1 |.-1 |-1 |3

이제 동일한 쿼리를 고려하지만 상수는 아닙니다.MCV목록 :

select * from tenk1 where StringU1 = 'xxx';

이것은 상당히 다른 문제입니다 : 토토 방법notinMCV목록. 접근 방식은 사실을 사용하는 것입니다MCVS :

selectivity = (1- sum (mvf))/(num_distinct -num_mcv)

즉,의 모든 주파수를 추가하십시오.MCVs에서 하나에서 빼낸 다음 분할하십시오기타별개의 값. 이것은의 일부를 가정하는 것입니다

행 = 1-1 |-1 |-1 |-1 | * -1 |.-1 |-1 |14559

이전 예제고유 한 <what의 지나치게 단순화되었습니다Scalarltsel실제로; 이제 우리가 보았습니다고유 1는 고유 한 열입니다히스토그램에는 부분이 포함되어 있지 않습니다. 우리는합니다Scalarltsel직접"<)) MCV 목록의 각 값에

StringU1 < 'iaaaaa'에서 tenk1에서 선택 *을 선택하십시오.

우리는 이미 MCV 정보를 봤습니다StringU1, 그리고 여기에 히스토그램이 있습니다 :

PG_STATS에서 histogram_bounds를 선택하십시오

MCV 목록 확인, 조건이 있음을 알게됩니다.StringU1 < 'iaaaaa'첫 번째는 만족합니다

selectivity = sum (관련 mvfs)

모든 MCF를 합산하면서IAAAAA거의 떨어집니다IAAAAA. 그런 다음 MCV의 추정치를 결합합니다

selectivity = mcv_selectivity + histogram_selectivity * histogram_fraction

이 특정 예에서 MCV 목록의 수정

이제에 둘 이상의 조건이있는 사례를 고려해 봅시다여기서절 :

tenk1에서 *를 선택하십시오.

플래너는 두 조건이 독립적이라고 가정합니다.

selectivity = selectivity (고유 1 <1-1 |-1 |-1 |) * selectivity (stringu1 = 'xxx')

반환 될 것으로 토토되는 행의 수

마지막으로 우리는 조인과 관련된 쿼리를 검사합니다 :

설명을 선택하십시오 * -1 | | T1, Tenk2 T2

제한 ON-1 | |,고유 한 <5-1 |, 이전에 평가됩니다고유 1히스토그램 :

selectivity = (-1 | + (5-1 |- 버킷 [1] .min)/(버킷 [1] .max- 버킷 [1] .min))/num_buckets

가입 제한은입니다.t2.unique2. 운영자는 우리의 친숙한 것입니다=, 그러나 선택성 함수는 얻어집니다oprjoin열의pg_operatoreqjoinsel.246-1 |7_24618통계 정보를 찾으십시오Tenk2-1 | |:

PG_STATS에서 TableName, NULL_FRAC, N_DISTINCT, MOST_COMMON_VALS를 선택하십시오

이 경우 NOMCV정보고유 2모든 값이 나타나기 때문에

selectivity = (1 -n_distinct |1) * (1 -n_distinct |2) * min (1/num_distinct1, 1/num_distinct2)

이것은 각각에 대해 하나에서 널 분수를 빼냅니다.

rows = (outer_cardinality * inner_cardinality) * 선택성

두 열에 대한 MCV 목록이 있었다.eqjoinsel직접 비교를 사용했을 것입니다

우리가 보여준 주목Inner_cardinalityas 1-1 |-1 |-1 |-1 |, 즉Tenk2. 아마도설명결합 행의 토토치가 5-1 | * 1, 즉, 즉,Tenk2. 그러나 이것은 사실이 아닙니다 : 조인

자세한 내용에 관심이있는 사람들의 경우여기서Clauses)에서 수행됩니다SRC/백엔드/최적화/util/plancat.c. 일반SRC/백엔드/최적화/PATH/CLAUSESEL.C. 그만큼src/backend/utils/adt/selfuncs.c.