다변수 상관 관계는 매우 간단한 데이터 세트, 즉 동일한 값을 포함하는 두 개의 열이 있는 테이블로 설명할 수 있습니다.
CREATE TABLE t (a INT, b INT); INSERT INTO t SELECT i % 100, i % 100 FROM generate_series(1, 10000) s(i); 분석 t;
설명에 따라토토 사이트 추천 _, 플래너는 다음의 카디널리티를 결정할 수 있습니다.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.00 루프=1)
필터: (a = 1)
필터에 의해 제거된 행: 9900
플래너는 조건을 검사하고 이 절의 선택도를 1%로 결정합니다. 이 추정값과 실제 행 수를 비교하면 추정값이 매우 정확하다는 것을 알 수 있습니다. 실제로는 테이블이 매우 작기 때문에 정확합니다. 변경어디사용 조건b열, 동일한 계획이 생성됩니다. 하지만 두 열에 동일한 조건을 적용하여 다음과 같이 결합하면 어떻게 되는지 관찰해 보세요.그리고:
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT * FROM t WHERE a = 1 AND b = 1;
쿼리 계획
--------------------------------------------------------------
t의 Seq 스캔(비용=0.00..195.00 행=1 너비=8)(실제 행=100.00 루프=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.00 루프=1)
필터: ((a = 1) AND (b = 1))
필터에 의해 제거된 행: 9900
다음에 의해 생성될 그룹 수와 같은 여러 열 집합의 카디널리티를 추정할 때 유사한 문제가 발생합니다.그룹별절. 언제그룹별단일 열을 나열하며 n개의 개별 추정치(HashAggregate 노드에서 반환된 추정 행 수로 표시됨)는 매우 정확합니다.
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT COUNT(*) FROM t GROUP BY a;
쿼리 계획
----------------------------------------------------------------------------
HashAggregate (비용=195.00..196.00 행=100 너비=12) (실제 행=100.00 루프=1)
그룹 키:
- t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=4)(실제 행=10000.00 루프=1)
그러나 다변량 토토 꽁 머니가 없으면 두 개의 열이 있는 쿼리의 그룹 수에 대한 추정은그룹별은 다음 예에서와 같이 크기 순서에서 벗어났습니다.
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT COUNT(*) FROM t GROUP BY a, b;
쿼리 계획
-------------------------------------------------------------------------------
HashAggregate(비용=220.00..230.00 행=1000 너비=16)(실제 행=100.00 루프=1)
그룹 키: a, b
- t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=8)(실제 행=10000.00 루프=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.00 루프=1)
그룹 키: a, b
- t에 대한 Seq 스캔(비용=0.00..145.00 행=10000 너비=8)(실제 행=10000.00 루프=1)
설명에 따라섹션 69.2.1, 함수적 종속성은 매우 저렴하고 효율적인 토토 꽁 머니 유형이지만 주요 제한 사항은 전역적 특성입니다(개별 열 값 간이 아닌 열 수준에서만 종속성을 추적함).
이 섹션에서는 다음의 다변량 변형을 소개합니다.MCV(가장 일반적인 값) 목록은 설명된 열별 토토 꽁 머니의 간단한 확장입니다.섹션 69.1. 이러한 토토 꽁 머니는 개별 값을 저장하여 제한 사항을 해결하지만 토토 꽁 머니를 구축하는 측면에서 당연히 비용이 더 많이 듭니다.분석, 저장 및 계획 시간.
다음의 쿼리를 살펴보겠습니다.섹션 69.2.1다시 말하지만 이번에는MCV동일한 열 집합에 목록이 생성되었습니다(플래너가 새로 생성된 토토 꽁 머니를 사용하도록 기능 종속성을 삭제해야 합니다).
통계 삭제 stts;
t에서 a, b에 대한 통계 stts2(mcv) 생성;
분석 t;
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT * FROM t WHERE a = 1 AND b = 1;
쿼리 계획
------------------------------------------------------------------
t의 Seq 스캔(비용=0.00..195.00 행=100 너비=8)(실제 행=100.00 루프=1)
필터: ((a = 1) AND (b = 1))
필터에 의해 제거된 행: 9900
추정치는 기능적 종속성만큼 정확합니다. 이는 주로 테이블이 상당히 작고 고유한 값 수가 적은 단순한 분포를 갖기 때문입니다. 함수적 종속성에 의해 특별히 잘 처리되지 않았던 두 번째 쿼리를 살펴보기 전에 먼저 다음 쿼리를 살펴보겠습니다.MCV조금 나열해 보세요.
점검 중MCV목록은 다음을 사용하여 가능합니다.pg_mcv_list_items세트 반환 함수.
m을 선택하세요.* pg_statistic_ext에서 pg_statistic_ext_data에 조인(oid = stxoid),
pg_mcv_list_items(stxdmcv) m WHERE stxname = 'stts2';
색인 | 가치 | 널 | 주파수 | 기본_주파수
--------+------------+-------+------------+---
0 | 0, 0 | f,f | 0.01 | 0.0001
1 | 1, 1 | f,f | 0.01 | 0.0001
...
49 | 49, 49 | f,f | 0.01 | 0.0001
50 | 50, 50 | f,f | 0.01 | 0.0001
...
97 | 97, 97 | f,f | 0.01 | 0.0001
98 | 98, 98 | f,f | 0.01 | 0.0001
99 | 99, 99 | f,f | 0.01 | 0.0001
(100행)
이는 두 열에 100개의 서로 다른 조합이 있음을 확인하고 모든 조합이 거의 동일할 가능성이 있음을 확인합니다(각 조합의 빈도는 1%). 기본 빈도는 다중 열 토토 꽁 머니가 없는 것처럼 열별 토토 꽁 머니에서 계산된 빈도입니다. 두 열 중 하나에 null 값이 있으면 이는널열.
선택성을 추정할 때 플래너는 다음 항목에 대한 모든 조건을 적용합니다.MCV목록을 작성한 다음 일치하는 항목의 빈도를 합산합니다. 참조mcv_clauselist_selectivity에src/backend/statistics/mcv.c자세한 내용은.
기능적 종속성과 비교하면,MCV목록에는 두 가지 주요 장점이 있습니다. 첫째, 목록에는 실제 값이 저장되어 어떤 조합이 호환되는지 결정할 수 있습니다.
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT * FROM t WHERE a = 1 AND b = 10;
쿼리 계획
---------------------------------------------------------------
t의 Seq 스캔(비용=0.00..195.00 행=1 너비=8)(실제 행=0.00 루프=1)
필터: ((a = 1) AND (b = 10))
필터에 의해 제거된 행: 10000
둘째,MCV목록은 기능적 종속성과 같은 동등 절뿐만 아니라 더 넓은 범위의 절 유형을 처리합니다. 예를 들어 동일한 테이블에 대해 다음 범위 쿼리를 고려해 보세요.
설명(분석, 타이밍 꺼짐, 버퍼 꺼짐) SELECT * FROM t WHERE a <= 49 AND b 49;
쿼리 계획
---------------------------------------------------------------
t의 Seq 스캔(비용=0.00..195.00 행=1 너비=8)(실제 행=0.00 루프=1)
필터: ((a <= 49) AND (b 49))
필터에 의해 제거된 행: 10000
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.