다변량 상관 관계는 매우 간단한 데이터 세트로 입증 될 수 있습니다. 동일한 값을 포함하는 두 개의 열이있는 테이블입니다.
생성 테이블 t (a int, b int); t select i % 100, generate_series (1, 10000) s (i)에서 i % 100에 삽입; t; 분석
설명 된대로PostgreSQL : 문서 : 10 : 14.2. 플래너가 사용하는 젠 토토, 플래너는의 카디널리티를 결정할 수 있습니다.t
에서 얻은 페이지와 행을 사용하여PG_CLASS
:
relname = 't'로 pg_class에서 reelpages, reltuples를 선택합니다. Relpages | 관계 ----------+----------- 45 | 10000
데이터 배포는 매우 간단합니다. 각 열에는 균일하게 분포 된 각 열에 100 개의 별개의 값 만 있습니다.
다음 예제는 A를 추정 한 결과를 보여줍니다여기서
조건에서a
열 :
설명 (분석, 타이밍 꺼짐)을 선택하십시오 *에서 t에서 a = 1; 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------. t에서의 seq 스캔 (cost = 0.00..170.00 행 = 100 너비 = 8) (실제 행 = 100 루프 = 1) 필터 : (a = 1) 필터로 제거 된 행 : 9900
플래너는 조건을 검사 하고이 조항의 선택성을 1%로 결정합니다. 이 추정치와 실제 행 수를 비교함으로써, 우리는 추정치가 매우 정확하다는 것을 알 수 있습니다 (실제로 테이블이 매우 작기 때문에 정확합니다). 변경여기서
사용 조건B
열에서 동일한 계획이 생성됩니다. 그러나 두 열에 동일한 조건을 적용하면를 결합하면 어떻게되는지 확인하십시오.및
:
설명 (분석, 타이밍 꺼짐)을 선택하십시오 *에서 t에서 a = 1 및 b = 1; 쿼리 계획 ---------------------------------------------------------------------------------------------------------- t에서의 seq 스캔 (cost = 0.00..195.00 행 = 1 너비 = 8) (실제 행 = 100 루프 = 1) 필터 : ((a = 1) 및 (b = 1)) 필터로 제거 된 행 : 9900
플래너는 각 조건의 선택성을 개별적으로 추정하여 위와 동일한 1% 추정치에 도달합니다. 그런 다음 조건이 독립적이라고 가정하므로 선택성을 곱하여 최종 선택성 추정치가 0.01%에 불과합니다. 조건 (100)과 일치하는 실제 행의 수가 2 배 더 높기 때문에 이것은 상당한 과소 평가입니다.
이 문제는 지시하는 사설 토토 객체를 만들어 해결할 수 있습니다분석
두 열에서 기능적 의존성 다변량 사설 토토를 계산하려면 :
a, b에서 B에 통계 Stts (종속성)를 생성합니다. 분석; 설명 (분석, 타이밍)을 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------------------------------------------------------. t에서의 seq 스캔 (cost = 0.00..195.00 행 = 100 너비 = 8) (실제 행 = 100 루프 = 1) 필터 : ((a = 1) 및 (b = 1)) 필터로 제거 된 행 : 9900
a에 의해 생성 될 그룹의 수와 같은 여러 열 집합의 카디널리티 추정치와 비슷한 문제가 발생합니다.그룹 by
절. 언제그룹 by
단일 열, n- 결정적인 추정치 (해고그 그레이트 노드에 의해 반환 된 행의 수 횟수로 볼 수 있음)가 매우 정확합니다..
설명 (분석, 타이밍 끄기) T Group에서 Count (*)를 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------------- 해고 그레이트 (비용 = 195.00..196.00 행 = 100 너비 = 12) (실제 행 = 100 루프 = 1) 그룹 키 : a - t에서 seq 스캔 (cost = 0.00..145.00 행 = 10000 너비 = 4) (실제 행 = 10000 루프 = 1)
그러나 다변량 사설 토토가 없으면 두 개의 열이있는 쿼리의 그룹 수에 대한 추정치그룹 by
, 다음 예에서와 같이, 크기는 꺼져 있습니다 :
설명 (분석, 타이밍 꺼짐) T 그룹에서 Count (*) A, B; 쿼리 계획 ---------------------------------------------------------------------------------------------------------- 해고 그레이트 (비용 = 220.00..230.00 행 = 1000 너비 = 16) (실제 행 = 100 루프 = 1) 그룹 키 : a, b - t에서 seq 스캔 (cost = 0.00..145.00 행 = 10000 너비 = 8) (실제 행 = 10000 루프 = 1)
두 열에 대한 n- 결정 수를 포함하도록 사설 토토 개체를 재정의하면 추정치가 훨씬 향상되었습니다.
드롭 통계 Stts; t에서 a, b에서 통계 Stts (종속성, ndistinct)를 만듭니다. 분석; 설명 (분석, 타이밍)을 선택하십시오. a, b로 t 그룹에서 count (*)를 선택하십시오. 쿼리 계획 ---------------------------------------------------------------------------------------------------------- 해고 그레이트 (비용 = 220.00..221.00 행 = 100 너비 = 16) (실제 행 = 100 루프 = 1) 그룹 키 : a, b - t에서 seq 스캔 (cost = 0.00..145.00 행 = 10000 너비 = 8) (실제 행 = 10000 루프 = 1)