이전 섹션에서 볼 수 있듯이 쿼리 플래너는 쿼리 계획을 잘 선택하기 위해 쿼리에서 검색된 행 수를 추정해야합니다. 이 섹션은 시스템 이이 추정치에 사용하는 통계를 빠르게 살펴보십시오.
젠 토토의 한 구성 요소는 각 테이블 및 인덱스의 총 항목 수와 각 테이블 및 인덱스가 차지하는 디스크 블록 수입니다. 이 정보는 표에 보관됩니다pg_class
, 열에서Reltuples
andRelpages
. 우리는 이것과 비슷한 쿼리로 그것을 볼 수 있습니다 :
Relname, Relkind, Reltuples, Relpages를 선택하십시오 pg_class에서 여기서 relname은 'tenk1%'; Relname | Relkind | reltuples | 재선 ------------------------------------------------------ Tenk1 | r | 10000 | 358 Tenk1_hundred | i | 10000 | 30 tenk1_thous_tenthous | i | 10000 | 30 Tenk1_unique1 | i | 10000 | 30 Tenk1_unique2 | i | 10000 | 30 (5 줄)
여기서 볼 수 있습니다Tenk1
인덱스와 마찬가지로 10000 행이 포함되어 있지만 인덱스는 (당연히) 테이블보다 훨씬 작습니다.
효율성 이유Reltuples
andRelpages
는 즉석에서 업데이트되지 않으므로 일반적으로 다소 오래된 값을 포함합니다. 그들은에 의해 업데이트됩니다.진공
, 분석
및와 같은 몇 가지 DDL 명령색인 생성
. 에이진공
또는분석
전체 테이블을 스캔하지 않는 작동 (일반적으로 경우)은 점차 업데이트됩니다Reltuples
스캔 한 테이블 부분을 기준으로 계산하여 대략적인 값을 초래합니다. 어쨌든 플래너는에서 찾은 값을 확장합니다.pg_class
현재 물리적 테이블 크기와 일치하려면 더 가까운 근사치를 얻습니다.
대부분의 쿼리는 테이블에서 행의 일부만 검색하여여기서
검사 할 행을 제한하는 조항. 따라서 플래너는를 추정해야합니다.선택성of여기서
조항, 즉의 각 조건과 일치하는 행의 비율여기서
절. 이 작업에 사용 된 정보는에 저장됩니다.PG_STATISTIC
시스템 카탈로그. 출품작PG_STATISTIC
분석
and진공 분석
명령, 신선하게 업데이트 될 때에도 항상 근사치입니다.
보지 않고PG_STATISTIC
직접, 그 견해를 보는 것이 좋습니다PG_STATS
수동으로 젠 토토를 검사 할 때.PG_STATS
는보다 쉽게 읽을 수 있도록 설계되었습니다. 뿐만 아니라,PG_STATS
모두 읽을 수 있지만PG_STATISTIC
슈퍼 사용자 만 읽을 수 있습니다. (이것은 비전지가없는 사용자가 젠 토토에서 다른 사람들의 테이블의 내용에 대해 배우는 것을 방지합니다.PG_STATS
보기는 현재 사용자가 읽을 수있는 테이블에 대한 행만 표시하도록 제한됩니다.) 예를 들어, 우리는 다음과 같습니다..
ATTNAME 선택, 상속, N_DISTINCT, most_common_vals로 array_to_string (most_common_vals, e '\ n') pg_stats에서 여기서 tableName = '도로'; ATTNAME | 상속 | n_distinct | 대부분의 _common_vals ---------+-----------+---------------------------------------------------- 이름 | f | -0.363388 | I-580 램프+ | | | I-880 램프+ | | | SP Railroad + | | | i-580 + | | | I-680 경사로 이름 | t | -0.284859 | I-880 램프+ | | | I-580 램프+ | | | I-680 램프+ | | | i-580 + | | | State Hwy 13 Ramp (2 줄)
동일한 열에 대해 두 개의 행이 표시되며, 하나는 완전한 상속 계층에 해당합니다.Road
테이블 (상속
=t
), 그리고 다른 하나만Road
테이블 자체 (상속
=F
).
저장된 정보의 양PG_STATISTIC
by분석
, 특히의 최대 항목 수most_common_vals
andhistogram_bounds
각 열의 배열은를 사용하여 열별로 설정할 수 있습니다Alter Table Set Statistics
명령 또는 전 세계적으로default_statistics_target구성 변수. 기본 제한은 현재 100 개의 항목입니다. 한도를 높이면 더 많은 공간을 소비하는 가격에PG_STATISTIC
추정치 계산에 약간 더 많은 시간. 반대로, 간단한 데이터 배포가있는 열에는 낮은 한계가 충분할 수 있습니다.
플래너의 젠 토토 사용에 대한 자세한 내용은 확인할 수 있습니다.스포츠 토토 사이트 : 문서 : 10 : 69. 플래너가 통계를 사용하는 방법.
쿼리 클로스에 사용 된 여러 열이 상관되기 때문에 불량 실행 계획을 실행하는 느린 쿼리를 보는 것이 일반적입니다. 플래너는 일반적으로 여러 조건이 서로 독립적이라고 가정합니다. 열 값이 상관 될 때 유지되지 않는 가정입니다. 개별 별 컬럼 당 성격으로 인해 일반 젠 토토는 크로스 컬럼 상관 관계에 대한 지식을 포착 할 수 없습니다. 하지만,PostgreSQL계산 능력이 있습니다다변량 젠 토토, 그러한 정보를 캡처 할 수 있습니다.
19189_19333확장 젠 토토 개체, 더 자주 Just라고 불젠 토토 개체, 흥미로운 열 세트에서 젠 토토를 얻도록 서버에게 지시하기 위해 생성 될 수 있습니다.
젠 토토 개체는를 사용하여 생성됩니다젠 토토 작성명령. 그러한 객체의 생성은 단지 젠 토토에 대한 관심을 표현하는 카탈로그 항목을 만듭니다. 실제 데이터 수집은에 의해 수행됩니다.19899_19908
(수동 명령 또는 배경 자동 분석). 수집 된 값은에서 검사 할 수 있습니다.PG_STATISTIC_EXT
카탈로그
Analyze
정기적 인 단일 열 통계를 컴퓨팅하는 데 걸리는 것과 동일한 테이블 행의 샘플을 기반으로 확장 통계를 계산합니다. 테이블 또는 그 열의 통계 대상을 늘려 표본 크기가 증가하기 때문에 (이전 섹션에서 설명한대로) 더 큰 통계 목표는 일반적으로보다 정확한 확장 통계를 초래할뿐만 아니라 더 많은 시간을 계산하는 데 소요됩니다..
다음 하위 섹션에서는 현재 지원되는 확장 통계의 종류를 설명합니다.
가장 간단한 종류의 확장 젠 토토 추적기능적 종속성, 데이터베이스 정상 양식의 정의에 사용되는 개념. 우리는 그 칼럼이라고 말합니다B
기능적으로 열에 의존합니다a
값에 대한 지식이a
의 값을 결정하기에 충분합니다B
, 그것은 동일한 값을 가진 두 줄이 없습니다a
그러나 다른 값B
. 완전히 정규화 된 데이터베이스에서 기능적 종속성은 기본 키 및 슈퍼 키에만 존재해야합니다. 그러나 실제로 많은 데이터 세트는 여러 가지 이유로 완전히 정규화되지 않습니다. 성능의 이유에 대한 의도적 인 피식이 일반적인 예입니다. 완전히 정규화 된 데이터베이스에서도 일부 열간에 부분적 상관 관계가있을 수 있으며, 이는 부분 기능 의존성으로 표현 될 수 있습니다.
기능적 종속성의 존재는 특정 쿼리에서 추정치의 정확도에 직접적인 영향을 미칩니다. 쿼리에 독립 및 종속 열의 조건이 포함 된 경우 종속 열의 조건은 결과 크기를 더 이상 감소시키지 않습니다. 그러나 기능적 의존성에 대한 지식이 없으면 쿼리 플래너는 조건이 독립적이라고 가정하여 결과 크기를 과소 평가합니다..
플래너에게 기능 의존성에 대해 알리려면분석
크로스 컬럼 종속성 측정을 수집 할 수 있습니다. 모든 열 사이의 종속성 정도를 평가하는 것은 엄청나게 비싸므로 데이터 수집은에 정의 된 젠 토토 객체에 함께 나타나는 열의 그룹으로 제한됩니다.종속성
옵션. 만드는 것이 좋습니다종속성
두 가지 모두에서 불필요한 오버 헤드를 피하기 위해 강하게 상관 관계가있는 열 그룹에 대해서만 젠 토토분석
그리고 나중에 쿼리 계획.
다음은 기능적 의존성 통계를 수집하는 예입니다.
Zipcodes의 도시, Zip에 통계 Stts (종속성) 만들기; zipcodes 분석; stxname, stxkeys, stxdependencies를 선택하십시오 pg_statistic_ext에서 여기서 stxname = 'stts'; stxname | stxkeys | stxdependencies ---------+--------+--------------------------------------------- Stts | 1 5 | "1 = 5": 1.000000, "5 = 1": 0.423130
여기서 열 1 (우편 번호)은 열 5 (도시)를 완전히 결정하여 계수가 1.0이지만 도시는 우편 번호 만 약 42%의 시간 만 결정하는 것을 알 수 있습니다. 즉, 단일 우편 번호보다 더 많은 도시 (58%)가 있음을 의미합니다..
기능적 종속 열과 관련된 쿼리의 선택성을 계산할 때 플래너는 과소 평가를 생성하지 않도록 종속성 계수를 사용하여 조건 당 선택성 추정치를 조정합니다..
기능적 종속성은 현재 열을 일정한 값과 비교하는 간단한 평등 조건을 고려할 때만 적용됩니다. 두 열을 비교하거나 열을 표현과 비교하거나 범위 조항을 비교하는 평등 조건에 대한 추정치를 개선하는 데 사용되지 않습니다.좋아요
또는 다른 유형의 조건.
기능적 종속성으로 추정 할 때 플래너는 관련 열의 조건이 호환되어 중복된다고 가정합니다. 호환되지 않으면 올바른 추정치는 0 행이지만 그 가능성은 고려되지 않습니다. 예를 들어,과 같은 쿼리가 주어지면
선택 * City = 'San Francisco'및 Zip = '94105';에서 Zipcodes에서 선택하십시오.
플래너는를 무시합니다City
선택성을 바꾸지 않은 조항. 그러나 그것은에 대해 같은 가정을 할 것입니다
선택 * City = 'San Francisco'및 Zip = '90210';에서 Zipcodes에서 선택 *
이 쿼리를 만족시키는 행이 실제로 없지만. 기능 의존성 젠 토토는 결론을 내릴 수있는 충분한 정보를 제공하지 않습니다.
많은 실제 상황 에서이 가정은 일반적으로 만족됩니다. 예를 들어, 애플리케이션에는 쿼리에서 사용할 수있는 호환 도시 및 우편 번호 값 만 선택할 수있는 GUI가있을 수 있습니다. 그러나 그렇지 않은 경우 기능적 종속성은 실행 가능한 옵션이 아닐 수 있습니다.
단일 열 젠 토토 각 열에 고유 한 값의 수를 저장합니다. 둘 이상의 열을 결합 할 때 고유 한 값 수의 추정치 (예 :그룹 별 그룹, b
) 플래너가 단일 열 젠 토토 데이터 만 있으면 잘못된 계획을 선택하게 할 때 종종 잘못된 것입니다.
그러한 추정치를 개선하려면분석
열 그룹에 대한 n- 결정 통계를 수집 할 수 있습니다. 이전과 마찬가지로 가능한 모든 열 그룹화에 대해이 작업을 수행하는 것은 비현실적이므로 데이터는로 정의 된 통계 객체에 함께 나타나는 열의 그룹에 대해서만 수집됩니다.ndistinct
옵션. 나열된 열 세트에서 2 개 이상의 열의 가능한 조합에 대해 데이터가 수집됩니다.
이전 예를 계속하면, 우편 번호 테이블의 N- 결정 수는 다음과 같을 수 있습니다.
Zipcodes에서 Zip, State, City에서 통계 Stts2 (ndistinct) 작성; zipcodes 분석; stxkeys를 K, stxndistinct로 선택하십시오 pg_statistic_ext에서 여기서 stxname = 'stts2'; -[레코드 1] --------------------------------------------------- k | 1 2 5 nd | "1, 2": 33178, "1, 5": 33178, "2, 5": 27435, "1, 2, 5": 33178
이것은 33178 개의 별개의 값을 가진 열의 세 가지 조합이 있음을 나타냅니다. 우편 번호 및 상태; 우편 번호 및 도시; 우편 번호, 도시 및 주 (우편 번호 만이이 표에서 독특하다는 점에서 모두 동일하다는 사실이 예상됩니다). 반면에 도시와 국가의 조합에는 27435 개의 뚜렷한 값이 있습니다.
생성하는 것이 좋습니다ndistinct
젠 토토 객체는 실제로 그룹화에 사용되는 열의 조합과 그룹 수의 오해가 나쁜 계획을 초래하는 열의 조합에만 해당됩니다. 그렇지 않으면분석
사이클이 낭비되었습니다.