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

69.2. 다변량 사설 토토 예시

69.2.1. 기능적 종속성

다변량 상관 관계는 매우 간단한 데이터 세트, 즉 동일한 값을 포함하는 두 개의 열이 있는 테이블로 설명할 수 있습니다.

CREATE TABLE t (a INT, b INT);
INSERT INTO t SELECT i % 100, i % 100 FROM generate_series(1, 10000) s(i);
분석 t;

설명에 따라PostgreSQL : 문서 : 10 : 14.2. 플래너가 사용하는 젠 토토, 플래너는 다음의 카디널리티를 결정할 수 있습니다.t다음에서 얻은 페이지 및 행 수 사용pg_class:

pg_class WHERE relname = 't'에서 relpages, reltuples 선택;

 렐페이지 | 리트플스
---------+------------
       45 |     10000

데이터 배포는 매우 간단합니다. 각 열에는 균일하게 분포된 100개의 고유 값만 있습니다.

다음 예는 a를 추정한 결과를 보여줍니다.어디조건:a열:

설명(분석, 타이밍 꺼짐) SELECT * FROM t WHERE a = 1;
                                 쿼리 계획                                  
------------------------------------------------------------------
 t의 Seq 스캔(비용=0.00..170.00 행=100 너비=8)(실제 행=100 루프=1)
   필터: (a = 1)
   필터에 의해 제거된 행: 9900

플래너는 조건을 검사하고 이 절의 선택도를 1%로 결정합니다. 이 추정값과 실제 행 수를 비교하면 추정값이 매우 정확하다는 것을 알 수 있습니다. 실제로는 테이블이 매우 작기 때문에 정확합니다. 변경어디사용 조건b열, 동일한 계획이 생성됩니다. 하지만 두 열에 동일한 조건을 적용하여 다음과 같이 결합하면 어떻게 되는지 관찰해 보세요.그리고:

설명(분석, 타이밍 꺼짐) SELECT * FROM t WHERE a = 1 AND b = 1;
                                 쿼리 계획                                  
----------------------------------------------------------------
 t에 대한 Seq 스캔(비용=0.00..195.00행=1너비=8)(실제 행=100루프=1)
   필터: ((a = 1) AND (b = 1))
   필터에 의해 제거된 행: 9900

플래너는 각 조건에 대한 선택성을 개별적으로 추정하여 위와 동일한 1% 추정치에 도달합니다. 그런 다음 조건이 독립적이라고 가정하고 선택성을 곱하여 최종 선택도 추정치는 0.01%에 불과합니다. 조건(100)과 일치하는 실제 행 수가 2배 더 높기 때문에 이는 상당히 과소평가된 것입니다.

이 문제는 다음을 지시하는 통계 개체를 생성하여 해결할 수 있습니다.분석두 열에 대한 기능 의존성 다변량 사설 토토를 계산하려면:

a, b FROM t에 대한 통계 stts(종속성) 생성;
분석 t;
설명(분석, 타이밍 꺼짐) SELECT * FROM t WHERE a = 1 AND b = 1;
                                  쿼리 계획                                   
------------------------------------------------------------------
 t의 Seq 스캔(비용=0.00..195.00 행=100 너비=8)(실제 행=100 루프=1)
   필터: ((a = 1) AND (b = 1))
   필터에 의해 제거된 행: 9900

69.2.2. 다변량 N-고유 개수

다음에 의해 생성될 그룹 수와 같은 여러 열 집합의 카디널리티를 추정할 때 유사한 문제가 발생합니다.그룹별절. 언제그룹별단일 열을 나열하며 n개의 개별 추정치(HashAggregate 노드에서 반환된 추정 행 수로 표시됨)는 매우 정확합니다.

설명(분석, 타이밍 꺼짐) SELECT COUNT(*) FROM t GROUP BY a;
                                       쿼리 계획                                        
---------------------------------------------------------------
 HashAggregate (비용=195.00..196.00 행=100 너비=12) (실제 행=100 루프=1)
   그룹 키:
   - t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=4)(실제 행=10000 루프=1)

그러나 다변량 사설 토토가 없으면 두 개의 열이 있는 쿼리의 그룹 수에 대한 추정은그룹별은 다음 예에서와 같이 크기 순서에서 벗어났습니다.

설명(분석, 타이밍 꺼짐) SELECT COUNT(*) FROM t GROUP BY a, b;
                                       쿼리 계획                                        
------------------------------------------------------------------
 HashAggregate (비용=220.00..230.00 행=1000 너비=16) (실제 행=100 루프=1)
   그룹 키: a, b
   - t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=8)(실제 행=10000 루프=1)

두 열에 대한 n-고유 개수를 포함하도록 사설 토토 개체를 재정의함으로써 추정치가 훨씬 향상되었습니다.

통계 삭제 stts;
통계 생성 stts(종속성, ndistinct) ON a, b FROM t;
분석 t;
설명(분석, 타이밍 꺼짐) SELECT COUNT(*) FROM t GROUP BY a, b;
                                       쿼리 계획                                        
------------------------------------------------------------------
 HashAggregate (비용=220.00..221.00 행=100 너비=16) (실제 행=100 루프=1)
   그룹 키: a, b
   - t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=8)(실제 행=10000 루프=1)