롤 토토 9.3.25 문서화 | ||||
---|---|---|---|---|
토토 사이트 순위 : 문서 : 9.3 : 플래너가 통계를 사용하는 방법 | up | 60 장. 어떻게 플래너는 통계를 사용합니다 | 다음 |
아래 표시된 예제는에 테이블을 사용합니다.롤 토토회귀 테스트 데이터베이스. 그만큼 표시된 출력은 버전 8.3에서 가져옵니다. 이전의 행동 (또는 이후) 버전은 다를 수 있습니다. 또한 이후로분석생산하는 동안 랜덤 샘플링을 사용합니다 통계, 결과는 새로운 후 약간 변경됩니다분석.
매우 간단한 쿼리로 시작합시다 :
설명을 설명하십시오 * Tenk1에서; 쿼리 계획 ---------------------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..458.00 행 = 10000 너비 = 244)
플래너가 카디널리티를 결정하는 방법Tenk1섹션 14.2이지만 여기에서 반복됩니다 완전성. 페이지와 행의 수는PG_CLASS:
relname = 'tenk1'인 pg_class에서 reelpages, reltuples를 선택합니다. Relpages | 관계 ----------+----------- 358 | 10000
이 숫자는 마지막으로 최신입니다진공또는분석on 테이블. 그런 다음 플래너는 실제 현재 페이지 수를 가져옵니다. 테이블에서 (이것은 저렴한 작동이며 테이블이 필요하지 않습니다. 주사). 그것이 다르면Relpagesthereltuples에 따라 a에 도달하도록 스케일링됩니다 현재 행 숫자 롤 토토치. 위의 예에서의 값은Relpages는 최신 상태입니다 롤 토토치는와 동일합니다.Reltuples.
범위 조건이있는 예로 넘어 가자여기서절 :
Tenk1에서 선택 *을 선택하십시오. 쿼리 계획 ----------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 24.06..394.64 행 = 1007 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <1000) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..23.80 행 = 1007 너비 = 0) 색인 조건 : (고유 1 <1000)
플래너는를 검사합니다.여기서절
조건 및 연산자의 선택성 함수를 찾습니다<inpg_operator. 이것은 열에 보관됩니다Oprrest,이 경우 항목은입니다.Scalarltsel
. 그만큼Scalarltsel
함수는 히스토그램을 검색합니다고유 1FromPG_STATISTICS. 수동 쿼리의 경우 더 많습니다
더 간단한 것을 보는 편리함PG_STATS보기 :
pg_stats에서 histogram_bounds를 선택하십시오 여기서 tableName = 'tenK1'및 AttName = '고유 한'; Histogram_bounds -------------------------------------------------------------- 0,993,1997,3050,4040,5036,5957,7057,8029,9016,9995
다음에 의해 점유 된 히스토그램의 분획"<1000"가 해결되었습니다. 이것이 선택성입니다. 히스토그램은 범위를 동일한 주파수 버킷으로 나눕니다. 우리가해야 할 일은 우리의 가치가있는 양동이를 찾는 것입니다. 세다part의all이전의 것. 값 1000은 분명히 두 번째 버킷 (993-1997)에 있습니다. 가정합니다 각 버킷 내부의 값의 선형 분포, 우리는 선택성을 다음과 같이 계산합니다.
selectivity = (1 + (1000- 버킷 [2] .min)/(버킷 [2] .max- 버킷 [2] .min))/num_buckets = (1 + (1000-993)/(1997-993))/10 = 0.100697
즉, 하나의 양동이와 두 번째 양동이의 선형 분율, 버킷 수로 나뉩니다. 예상 행 수는 가능합니다 이제 선택성과 의 추기경Tenk1:
rows = rel_cardinality * 선택성 = 10000 * 0.100697 = 1007 (반올림)
다음으로 평등 조건이있는 예를 고려해 봅시다여기서절 :
select * tenk1에서 stringu1 = 'craaaa'; 쿼리 계획 -------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 30 너비 = 244) 필터 : (stringu1 = 'craaaa':: name)
다시 플래너가를 검사합니다여기서조항 조건 및 선택성 함수를 찾아=,eqsel
. 평등 롤 토토의 경우 히스토그램은입니다
유용하지 않습니다. 대신 목록가장 일반적입니다
값(MCVs)는 익숙합니다
선택성을 결정하십시오. MCV를 살펴 보겠습니다
나중에 유용 할 추가 열 :
null_frac, n_distinct, most_common_vals, most_common_freqs pg_stats를 선택하십시오 여기서 tableName = 'tenK1'및 AttName = 'StringU1'; null_frac | 0 n_distinct | 676 Most_common_vals | ejaaaa, bbaaaa, craaaa, fcaaaa, feaaaa, gsaaaa, joaaaa, mcaaaa, naaaaa, wgaaaa
이후Craaaa목록에 나타납니다 MCVS, 선택성은 단지 목록의 해당 항목 일뿐입니다. 가장 일반적인 주파수 (MCFs) :
선택성 = MCF [3] = 0.003
이전과 마찬가지로, 예상 행 수는 단지 이것은의 추기경과 함께Tenk1:
행 = 10000 * 0.003 = 30
이제 동일한 쿼리를 고려하지만 상수는 없습니다. 그만큼MCV목록 :
select * tenk1에서 stringu1 = 'xxx'; 쿼리 계획 -------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 15 너비 = 244) 필터 : (stringu1 = 'xxx':: name)
이것은 상당히 다른 문제입니다 : 롤 토토 방법 값이있을 때 선택성notinMCV목록. 접근 방식은 사실을 사용하는 것입니다 값은 목록에 있지 않으며 모든 주파수MCVS :
selectivity = (1- sum (mvf))/(num_distinct -num_mcv) = (1- (0.00333333 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003))/(676-10) = 0.0014559
즉,의 모든 주파수를 추가하십시오.MCVs에서 하나에서 빼낸 다음 분할하십시오 수기타별개의 값. 이것은의 일부를 가정하는 것입니다 MCV가 아닌 열은 모든 사람에게 균등하게 배포됩니다. 다른 뚜렷한 값. 널 값이 없다는 점에 주목하십시오 우리는 그것들에 대해 걱정할 필요가 없습니다 (그렇지 않으면 우리는 분자로부터의 널 분수). 예상 수 그런 다음 행은 평소와 같이 계산됩니다.
행 = 10000 * 0.0014559 = 15 (반올림)
이전 예제고유 한 <
1000what의 지나치게 단순화되었습니다Scalarltsel
실제로; 이제 우리는 an을 보았습니다
MCV 사용의 예, 더 자세한 내용을 채울 수 있습니다. 그만큼
그 이후로 예를 들었 기 때문에 예는고유 한 1MCV가없는 고유 한 열입니다
(분명히 다른 값보다 더 일반적이지 않습니다). 을 위한
비 유니 키 열, 일반적으로 히스토그램과
MCV 목록 및히스토그램
not include the portion of the column population represented by the
MCV. 우리는 더 정확하게 허용하기 때문에 이렇게합니다.
견적. 이 상황에서Scalarltsel
조건을 직접 적용합니다 (예 :"<1000") MCV의 각 값에
목록을 작성하고 MCV의 주파수를 추가합니다.
조건은 사실입니다. 이것은 선택성의 정확한 추정치를 제공합니다
MCV 인 테이블 부분 내에서. 히스토그램이 있습니다
위의 선택성을 추정하기 위해 위와 같은 방식으로 사용
MCV가 아닌 테이블의 일부는 두 숫자는
전체 선택성을 추정하기 위해 결합되었습니다. 예를 들어,
고려하다
select * from tenk1 where Stringu1 < 'iaaaaaa'; 쿼리 계획 ------------------------------------------------------------------- Tenk1의 Seq 스캔 (비용 = 0.00..483.00 행 = 3077 너비 = 244) 필터 : (stringu1 < 'iaaaaa':: name)
우리는 이미 MCV 정보를 보았습니다StringU1, 그리고 여기에 히스토그램이 있습니다 :
PG_STATS에서 histogram_bounds를 선택하십시오 여기서 tableName = 'tenK1'및 AttName = 'StringU1'; Histogram_bounds ----------------------------------------------------------------------------------------- aaaaaa, cqaaaa, fraaaa, ibaaaa, kraaaa, nfaaaa, psaaaa, sgaaaa, vaaaaa, xlaaaa, zzaaaa
MCV 목록 확인, 조건이 있음을 알게됩니다.StringU1 < 'iaaaaa'처음 6 명은 만족합니다 마지막 4 개가 아닌 항목이 아니므로 MCV 내의 선택성 인구의 일부는
selectivity = sum (관련 mvfs) = 0.00333333 + 0.003 + 0.003 + 0.003 + 0.003 + 0.003 = 0.01833333
모든 MCF를 합산하면서 MCV로 대표되는 인구는 0.03033333이므로 히스토그램으로 표시되는 분획은 0.96966667입니다 (다시, 거기에 널이 아니에요. 그렇지 않으면 여기에 제외해야합니다). 우리는 그것을 볼 수 있습니다 값IAAAAA거의 끝에 떨어집니다 세 번째 히스토그램 버킷의. 오히려 어리석은 가정을 사용합니다 다른 문자의 빈도에 대해, 플래너는 히스토그램 모집단 부분에 대한 롤 토토치 0.298387 그것은보다 작습니다IAAAAA. 그런 다음 우리는 결합합니다 MCV 및 비 MCV 인구에 대한 추정치 :
selectivity = mcv_selectivity + histogram_selectivity * histogram_fraction = 0.0183333 + 0.298387 * 0.96966667 = 0.307669 행 = 10000 * 0.307669 = 3077 (반올림)
이 특정 예에서 MCV 목록의 수정은 다음과 같습니다. 열 분포가 실제로 상당히 꽤 작기 때문에 상당히 작습니다 평평한 (이러한 특정 값을 더 많이 보여주는 통계 다른 것보다 일반적으로 샘플링 오류로 인한 것입니다). 더 일부 값이보다 훨씬 더 일반적인 경우 다른 것,이 복잡한 프로세스는 유용한 개선을 제공합니다 가장 일반적인 값의 선택성은 정확히 찾았습니다.
이제에 둘 이상의 조건이있는 사례를 고려해 봅시다여기서절 :
tenk1에서 선택 *을 선택하십시오. 쿼리 계획 ----------------------------------------------------------------------------------------- Tenk1의 비트 맵 힙 스캔 (비용 = 23.80..396.91 행 = 1 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <1000) 필터 : (stringu1 = 'xxx':: name) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..23.80 행 = 1007 너비 = 0) 색인 조건 : (고유 1 <1000)
플래너는 두 조건이 독립적이라고 가정합니다. 조항의 개별 선택성을 곱할 수 있습니다. 함께:
selectivity = selectivity (고유 1 <1000) * selectivity (stringu1 = 'xxx') = 0.100697 * 0.0014559 = 0.0001466 행 = 10000 * 0.0001466 = 1 (반올림)
비트 맵 인덱스 스캔은 인덱스에 사용 된 조건 만 반영합니다. 이것은 비용 롤 토토치에 영향을 미치기 때문에 중요합니다. 후속 힙이 가져옵니다.
마지막으로 우리는 조인과 관련된 쿼리를 검사합니다 :
설명 *에서 10, Tenk2 T2에서 선택하십시오 여기서 t1.unique1 <50 및 t1.unique2 = t2.unique2; 쿼리 계획 ----------------------------------------------------------------------------------------------------- 중첩 루프 (비용 = 4.64..456.23 줄 = 50 너비 = 488) - tenk1 t1의 비트 맵 힙 스캔 (비용 = 4.64..142.17 행 = 50 너비 = 244) COND를 다시 확인하십시오 : (고유 1 <50) - tenk1_unique1의 비트 맵 인덱스 스캔 (비용 = 0.00..4.63 행 = 50 너비 = 0) 색인 조건 : (고유 1 <50) - tenk2 t2에서 tenk2_unique2를 사용한 인덱스 스캔 (비용 = 0.00..6.27 행 = 1 너비 = 244) 색인 조건 : (고유 2 = t1.unique2)
제한 ONTenk1, 고유 한 <50는 중첩 루프 전에 평가됩니다 가입하다. 이것은 이전 범위 예제와 유사하게 처리됩니다. 이번에는 값 50이의 첫 번째 버킷으로 떨어집니다고유 한히스토그램 :
selectivity = (0 + (50- 버킷 [1] .min)/(버킷 [1] .max- 버킷 [1] .min))/num_buckets = (0 + (50-0)/(993-0))/10 = 0.005035 행 = 10000 * 0.005035 = 50 (반올림)
가입 제한은입니다.t2.unique2 =
T1.unique2. 운영자는 우리의 친숙한 것입니다=, 그러나 선택성 함수는 얻어집니다
그만큼oprjoin열의pg_operatoreqjoinsel
. eqjoinsel
통계 정보를 찾습니다
둘 다Tenk2및TENK1:
PG_STATS에서 TableName, NULL_FRAC, N_DISTINCT, MOST_COMMON_VALS를 선택하십시오 여기서 ( 'tenk1', 'tenk2') 및 attname = '고유 2' 표준 이름 | null_frac | n_distinct | 대부분의 _common_vals -----------+----------+-------------------------------- Tenk1 | 0 | -1 | Tenk2 | 0 | -1 |
이 경우 아무도 없습니다MCV정보고유 2값은 고유 한 것으로 보이므로 의존하는 알고리즘을 사용합니다. 두 관계에 대한 뚜렷한 값의 수에만 그들의 null 분수로 :
selectivity = (1 -null_frac1) * (1 -null_frac2) * min (1/num_distinct1, 1/num_distinct2) = (1-0) * (1-0) / max (10000, 10000) = 0.0001
이것은 각각에 대해 하나에서 널 분수를 빼냅니다. 관계, 그리고 별개의 최대 숫자로 나누기 값. 결합이 방출 될 가능성이있는 행의 수는 두 사람의 카르테시아 제품의 카디널스로 계산 입력, 선택성을 곱한 입력 :
rows = (outer_cardinality * inner_cardinality) * 선택성 = (50 * 10000) * 0.0001 = 50
두 열에 대한 MCV 목록이 있었다.eqjoinsel
직접 비교를 사용했을 것입니다
MCV는
MCV로 대표되는 열 집단. 추정치
인구의 나머지 부분은 보여준 동일한 접근법을 따릅니다.
여기.
우리가 보여준 주목Inner_cardinalityas 10000, 즉, 수정되지 않은 크기TENK2. 검사에서 나타날 수 있습니다.설명가입 롤 토토치를 출력합니다 행은 50 * 1, 즉 외부 행의 수는 각 내부 색인 스캔에서 얻은 예상 행 수Tenk2. 그러나 이것은 사실이 아닙니다 교사 관계 크기는 특정 조인 계획이 있기 전에 추정됩니다. 고려되었습니다. 모든 것이 잘 작동한다면 두 가지 방법 조인 크기를 추정하면 같은 답변이 생성되지만 라운드 오프 오류 및 기타 요인으로 인해 때때로 분기됩니다. 중요하게.
자세한 내용에 관심이있는 사람들의 경우 크기 롤 토토 테이블의 (이전여기서Clauses) IS 완료SRC/백엔드/최적화/util/plancat.c. 일반 절정에 대한 논리 선택은에 있습니다.SRC/백엔드/최적화/PATH/CLAUSESEL.C. 그만큼 연산자 별 선택성 함수는 대부분에서 발견됩니다.src/backend/utils/adt/selfuncs.c.
이전 | 배트맨 롤 토토 : 문서 : 9.3 : 배트맨 롤 토토 9.3.25 문서화 | 다음 |
플래너의 사용 방법 통계 | up | 플래너 통계 및 보안 |