아래 표시된 예제는에 테이블을 사용합니다.PostgreSQL1-1 |-1 |13_1-1 |-1 |59분석
1-1 |53-1 |_1-1 |625분석
.
1-1 |-1 |-1 |4_1-1 |-1 |41
1-1 |746_1-1 |934
1-1 |212_1-1 |257Tenk1
9637_965-1 |977-1 |_97871-1 |893_1-1 |978PG_CLASS
:
relname = 'tenk1'인 pg_class에서 reelpages, reltuples를 선택하십시오.
1-1 |385_1-1 |42599-1 |-1 |_99-1 |6
또는분석
114-1 |5_11574Relpages
1-1 |-1 |43_1-1 |-1 |471-1 |-1 |19_1-1 |-1 |28
에 따라 현재 열 숫자 추정치에 도달하도록 스케일링됩니다. 위의 예에서의 값은Relpages
1-1 |839_1-1 |8881-1 |-1 |19_1-1 |-1 |28
.
범위 조건이있는 예로 넘어 가자1-1 |225_1-1 |23-1 |
1-1 |216_1-1 |223
설명 *에서 * -1 | |에서 고유 한 <1-1 |-1 |-1 |;
1-1 |655_1-1 |6791-1 |225_1-1 |23-1 |
조항 조건 및 연산자의 선택성 함수를 찾습니다<
1-1 |444_1-1 |4461-1 |383_1-1 |394
1-1 |822_1-1 |85-1 |1-1 |457_1-1 |464
1-1 |891_1-1 |9221-1 |486_1-1 |497
1-1 |561_1-1 |5661-1 |486_1-1 |497
함수는 히스토그램을 검색합니다1-1 |611_1-1 |618
1-1 |693_1-1 |6971-1 |635_1-1 |647
1181-1 |_118751-1 |689_1-1 |697
1-1 |772_1-1 |777
pg_stats에서 histogram_bounds를 선택하십시오
11558_116-1 |4“1-1 |819_1-1 |828”12885_13-1 |591-1 |985_1-1 |9891-1 |9-1 |-1 |_1-1 |9-1 |911-1 |46_11-1 |49이전의 것들. 값 1000은 분명히 두 번째 버킷 (993–1997)에 있습니다.
12878_13-1 |36
즉, 하나의 전체 버킷과 두 번째 버킷의 선형 분율을 버킷 수로 나눈 값입니다. 토토 결과 된 행 수는 이제 선택성의 산물로 계산 될 수 있습니다.Tenk1
:
1268-1 |_12768
1232-1 |_123841-1 |225_1-1 |23-1 |
1-1 |216_1-1 |223
14464_1471-1 |
11676_117-1 |61-1 |225_1-1 |23-1 |
조항 조건 및 선택성 함수를 찾아=
,eqsel
. 평등 토토 결과의 경우 히스토그램은 유용하지 않습니다.가장 일반적인 값 (MCVs)는 선택성을 결정하는 데 사용됩니다. 나중에 유용 할 추가 열이 포함 된 MCV를 살펴 보겠습니다.
n_distinct |, n_distinct, most_common_vals, most_common_freqs pg_stats를 선택하십시오
이후11599_116-1 |5
MCV 목록에 나타나면 선택성은 가장 일반적인 주파수 목록에서 해당 항목입니다 (MCF11787_1179-1 |
선택성 = MCF [3]
이전과 마찬가지로, 추정 된 행 수는 카디널리티의 곱 일뿐입니다.Tenk1
:
122-1 |9_12239
이제 동일한 쿼리를 고려하지만 상수가없는 상수는MCV목록 :
1568-1 |_1592-1 |
137-1 |2_13786아님12-1 |-1 |1_12-1 |-1 |7MCV목록. 접근 방식은 값이 목록에 없다는 사실을 사용하는 것입니다.MCVS :
15866_16-1 |85
129-1 |7_1295-1 |MCV134-1 |1_1345912315_1232-1 |별개의 값. 이는 MCV가 아닌 열의 비율이 다른 모든 뚜렷한 값에 균등하게 분포된다고 가정하는 것입니다.
행 = 10000 * 0.0014559
127-1 |7_1273212353_1237-1 |
무엇을 지나치게 단순화했습니다1-1 |486_1-1 |497
실제로; 이제 MCV 사용의 예를 보았으므로 더 자세한 내용을 채울 수 있습니다.1-1 |611_1-1 |618
고유 한 열입니다. MCV가 없습니다 (분명히 다른 값보다 더 일반적인 값은 없습니다). 비 유니 키 열의 경우 일반적으로 히스토그램과 MCV 목록이 모두 있으며1467-1 |_14761. 우리는보다 정확한 토토 결과을 허용하기 때문에 이런 식으로 일을합니다.1-1 |486_1-1 |497
조건을 직접 적용합니다 (예 :“1-1 |819_1-1 |828”)) MCV 목록의 각 값에, 조건이 사실 인 MCV의 주파수를 추가합니다. 이것은 MCV의 테이블 부분 내에서 선택성을 정확하게 추정합니다.
18-1 |18_18275
우리는 이미 MCV 정보를 보았습니다StringU1
13192_1322-1 |
18432_1873-1 |
139-1 |6_1395513248_1327-1 |
마지막 4 개가 아닌 첫 6 개의 항목에 의해 만족되므로 인구의 MCV 부분 내에서의 선택성은입니다.
selectivity = sum (관련 mvfs)
18847_1912-1 |13-1 |26_13-1 |32
184-1 |9_1865213-1 |26_13-1 |32
148-1 |2_1487-1 |
17896_181-1 |9
이 특정 예에서 MCV 목록의 수정은 상당히 작습니다. 열 분포는 실제로 상당히 평평하기 때문에 (이러한 특정 값을 보여주는 통계는 대부분 샘플링 오류로 인한 것입니다). 일부 값보다 일부 값이 다른 값보다 훨씬 일반적인 경우,이 복잡한 프로세스는 가장 일반적인 값의 선택성이 정확히 발견되기 때문에 정확도가 유용한 개선을 제공합니다..
이제에 둘 이상의 조건이있는 사례를 고려해 봅시다1-1 |225_1-1 |23-1 |
1-1 |216_1-1 |223
tenk1에서 선택 *을 선택하십시오.
16768_169-1 |8
18-1 |82_18282
비트 맵 인덱스 스캔에서 반환 된 것으로 토토 결과 된 행 수는 인덱스와 함께 사용 된 조건 만 반영합니다. 이것은 후속 힙 페치의 비용 토토 결과치에 영향을 미치기 때문에 중요합니다.
1454-1 |_14593
설명 *에서 1-1 |, Tenk2 T2에서 선택하십시오
제한 ONTenk1
, 1349-1 |_135-1 |5
, 중첩 루프 가입 전에 평가됩니다. 이것은 이전 범위 예제와 유사하게 처리됩니다.1-1 |611_1-1 |618
히스토그램 :
19176_1939-1 |
가입 제한은입니다.14-1 |53_14-1 |76
14371_144-1 |6=
15155_1521-1 |13773_1378-1 |
열의1-1 |383_1-1 |394
138-1 |2_1381-1 |eqjoinsel
. eqjoinsel
둘 다에 대한 통계 정보를 찾아보십시오14-1 |9-1 |_14-1 |95
14217_1422-1 |Tenk1
:
PG_STATS에서 TableName, NULL_FRAC, N_DISTINCT, MOST_COMMON_VALS를 선택하십시오
이 경우 아니요MCV정보고유 2
2-1 |513_2-1 |742
18-1 |6-1 |_1821-1 |
이것은 각 관계에 대해 하나에서 널 분수를 빼고 더 큰 관계의 행 카운트로 나눕니다 (이 값은 비 유니 케이스에서는 조정됩니다). 결합이 방출 될 가능성이있는 행의 수는 두 입력의 데카르트 제품의 카디 안 제품으로 계산되며, 선택성을 곱합니다.
172-1 |8_173-1 |7
두 열에 대한 MCV 목록이 있었다.eqjoinsel
214-1 |7_21646
우리가 보여준 주목Inner_cardinality
as 10000, 즉, 수정되지 않은 크기14-1 |9-1 |_14-1 |95
. 검사에서 나타날 수 있습니다.설명
결합 행의 토토 결과치가 50 * 1, 즉 외부 행의 수는 각 내부 색인 스캔에서 얻은 토토 결과 행 수의 횟수14-1 |9-1 |_14-1 |95
. 그러나 이것은 그렇지 않습니다. 조인 관계 크기는 특정 조인 계획이 고려되기 전에 토토 결과됩니다.
173-1 |4_1739-1 |1-1 |225_1-1 |23-1 |
Clauses)에서 수행됩니다SRC/백엔드/최적화/util/plancat.c
161-1 |8_16158SRC/백엔드/최적화/PATH/CLAUSESEL.C
. 연산자 별 선택성 함수는 대부분에서 발견됩니다.src/backend/utils/adt/selfuncs.c
.