이전 섹션에서 볼 수 있듯이 쿼리 플래너는 쿼리 계획을 잘 선택하기 위해 쿼리에서 검색된 행 수를 추정해야합니다. 이 섹션은 시스템 이이 추정치에 사용하는 통계를 빠르게 살펴보십시오.
토토 꽁 머니의 한 구성 요소는 각 테이블 및 인덱스의 총 항목 수와 각 테이블 및 인덱스가 차지하는 디스크 블록 수입니다. 이 정보는 표에 보관됩니다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
추정치 계산에 약간 더 많은 시간. 반대로, 간단한 데이터 배포가있는 열에는 낮은 한계가 충분할 수 있습니다.
플래너의 토토 꽁 머니 사용에 대한 자세한 내용은에서 찾을 수 있습니다.토토 베이 : 문서 : 13 : 71 장. 플래너가 통계를 사용하는 방법.
쿼리 클로스에 사용 된 여러 열이 상관되기 때문에 느린 쿼리가 잘못 실행 계획을 실행하는 것이 일반적입니다. 플래너는 일반적으로 여러 조건이 서로 독립적이라고 가정합니다. 열 값이 상관 될 때 유지되지 않는 가정입니다. 개별 별 컬럼 당 성격으로 인해 일반 토토 꽁 머니는 크로스 컬럼 상관 관계에 대한 지식을 포착 할 수 없습니다. 하지만,PostgreSQL계산 능력이 있습니다다변량 토토 꽁 머니, 그러한 정보를 캡처 할 수 있습니다.
가능한 열 조합의 수는 매우 크기 때문에 다변량 토토 꽁 머니를 자동으로 계산하는 것이 비현실적입니다. 대신에,확장 토토 꽁 머니 객체토토 꽁 머니 개체, 흥미로운 열 세트에서 토토 꽁 머니를 얻도록 서버에게 지시하기 위해 생성 될 수 있습니다.
토토 꽁 머니 개체는를 사용하여 생성됩니다토토 꽁 머니 생성명령. 그러한 객체의 생성은 단지 토토 꽁 머니에 대한 관심을 표현하는 카탈로그 항목을 만듭니다. 실제 데이터 수집은에 의해 수행됩니다.분석
(수동 명령 또는 배경 자동 분석). 수집 된 값은에서 검사 할 수 있습니다.PG_STATISTIC_EXT_DATA
카탈로그
분석
정기적 인 단일 열 통계를 컴퓨팅하는 데 걸리는 것과 동일한 테이블 행의 샘플을 기반으로 확장 통계를 계산합니다. 테이블 또는 그 열의 통계 대상을 늘려 표본 크기가 증가하기 때문에 (이전 섹션에서 설명한대로) 더 큰 통계 목표는 일반적으로보다 정확한 확장 통계를 초래할뿐만 아니라 더 많은 시간을 계산하는 데 소요됩니다..
다음 하위 섹션에서는 현재 지원되는 확장 통계의 종류를 설명합니다.
가장 간단한 종류의 확장 토토 꽁 머니 추적기능적 종속성, 데이터베이스 정상 양식의 정의에 사용되는 개념. 우리는 그 칼럼이라고 말합니다b
기능적으로 열에 의존합니다a
값에 대한 지식이a
값을 결정하기에 충분합니다b
, 그것은 동일한 값을 가진 두 줄이 없습니다a
그러나 다른 값b
. 완전히 정규화 된 데이터베이스에서 기능적 종속성은 기본 키 및 슈퍼 키에만 존재해야합니다. 그러나 실제로 많은 데이터 세트는 여러 가지 이유로 완전히 정규화되지 않습니다. 성능의 이유에 대한 의도적 인 피식이 일반적인 예입니다. 완전히 정규화 된 데이터베이스에서도 일부 열간에 부분적 상관 관계가있을 수 있으며, 이는 부분 기능 의존성으로 표현 될 수 있습니다.
기능적 종속성의 존재는 특정 쿼리에서 추정치의 정확도에 직접적인 영향을 미칩니다. 쿼리에 독립 및 종속 열의 조건이 포함 된 경우 종속 열의 조건은 결과 크기를 더 이상 감소시키지 않습니다. 그러나 기능적 의존성에 대한 지식이 없으면 쿼리 플래너는 조건이 독립적이라고 가정하여 결과 크기를 과소 평가합니다..
기능적 종속성에 대해 플래너에게 알리려면분석
크로스 컬럼 종속성 측정을 수집 할 수 있습니다. 모든 열 사이의 종속성 정도를 평가하는 것은 엄청나게 비싸므로 데이터 수집은에 정의 된 토토 꽁 머니 객체에 함께 나타나는 열의 그룹으로 제한됩니다.종속성
옵션. 만드는 것이 좋습니다종속성
두 가지에서 불필요한 오버 헤드를 피하기 위해 강하게 상관 관계가있는 열 그룹에 대해서만 토토 꽁 머니분석
그리고 나중에 쿼리 계획.
기능 의존성 통계를 수집하는 예는 다음과 같습니다.
도시에 통계 Stts (종속성), Zipcodes의 zip; zipcodes 분석; stxname, stxkeys, stxdddependencies를 선택하십시오 pg_statistic_ext에서 pg_statistic_ext_data on (oid = stxoid) 여기서 stxname = 'stts'; stxname | stxkeys | stxdddependencies ---------+--------+--------------------------------------------- Stts | 1 5 | "1 = 5": 1.000000, "5 = 1": 0.423130
여기서 열 1 (우편 번호)은 열 5 (도시)를 완전히 결정하여 계수가 1.0이면 도시는 우편 번호 만 결정하는 반면, 시점은 단일 우편 번호보다 더 많은 도시 (58%)가 있음을 의미합니다..
기능적 종속 열과 관련된 쿼리의 선택성을 계산할 때 플래너는 과소 평가를 생성하지 않기 위해 종속성 계수를 사용하여 조건 당 선택성 추정치를 조정합니다..
기능적 종속성은 현재 열을 일정한 값과 비교하는 간단한 평등 조건을 고려할 때만 적용됩니다.in
일정한 값을 가진 조항. 두 열을 비교하거나 열을 표현과 비교하거나 범위 조항을 비교하는 평등 조건에 대한 추정치를 개선하는 데 사용되지 않습니다.좋아요
또는 다른 유형의 조건.
기능적 종속성으로 추정 할 때 플래너는 관련 열의 조건이 호환되어 중복된다고 가정합니다. 호환되지 않으면 올바른 추정치는 0 행이지만 그 가능성은 고려되지 않습니다. 예를 들어,과 같은 쿼리가 주어지면
City = 'San Francisco'및 Zip = '94105';에서 Zipcodes에서 * 선택 * 선택 *
플래너는를 무시합니다City
선택성을 바꾸지 않은 조항. 그러나 그것은에 대해 같은 가정을 할 것입니다
선택 * City = 'San Francisco'및 Zip = '90210';에서 Zipcodes에서 선택 *
이 쿼리를 만족하는 행이 실제로 0 인 경우가 있습니다. 기능 의존성 토토 꽁 머니는 결론을 내릴 수있는 충분한 정보를 제공하지 않습니다.
많은 실제 상황 에서이 가정은 일반적으로 충족됩니다. 예를 들어, 애플리케이션에는 쿼리에서 사용할 수있는 호환 도시 및 우편 번호 값 만 선택할 수있는 GUI가있을 수 있습니다. 그러나 그렇지 않은 경우 기능적 종속성은 실행 가능한 옵션이 아닐 수 있습니다.
단일 열 토토 꽁 머니 각 열에 고유 한 값의 수를 저장합니다. 둘 이상의 열을 결합 할 때 고유 한 값 수의 추정치 (예 :그룹 별 그룹, b
) 플래너가 단일 열 토토 꽁 머니 데이터 만 있으면 잘못된 계획을 선택할 수있는 경우 자주 잘못됩니다.
그러한 추정치를 개선하려면분석
열 그룹에 대한 n- 결정 통계를 수집 할 수 있습니다. 이전과 마찬가지로 가능한 모든 열 그룹화에 대해이 작업을 수행하는 것은 비현실적이므로 데이터는로 정의 된 통계 객체에 함께 나타나는 열의 그룹에 대해서만 수집됩니다.ndistinct
옵션. 나열된 열 세트에서 2 개 이상의 열의 가능한 조합에 대해 데이터가 수집됩니다.
이전 예를 계속하면 우편 번호 테이블의 N- 결정 수는 다음과 같습니다.
도시, 주, zipcodes의 zip에 통계 Stts2 (ndistinct) 생성; zipcodes 분석; stxkeys를 K, stxdndistinct로 선택하십시오 pg_statistic_ext에서 pg_statistic_ext_data on (oid = stxoid) 여기서 stxname = 'stts2'; -[레코드 1] ----------------------------------------------------- k | 1 2 5 nd | "1, 2": 33178, "1, 5": 33178, "2, 5": 27435, "1, 2, 5": 33178
이것은 33178 개의 별개의 값을 갖는 열의 세 가지 조합이 있음을 나타냅니다. 우편 번호 및 상태; 우편 번호 및 도시; 우편 번호, 도시 및 주 (우편 번호 만이이 표에서 독특하다는 점에서 모두 동일하다는 사실이 예상됩니다). 반면에 도시와 국가의 조합에는 27435 개의 뚜렷한 값이 있습니다.
생성하는 것이 좋습니다ndistinct
토토 꽁 머니 객체는 실제로 그룹화에 사용되는 열의 조합과 그룹 수의 오해가 나쁜 계획을 초래하는 열의 조합에만 해당됩니다. 그렇지 않으면분석
사이클이 낭비되었습니다.
각 열에 저장된 다른 유형의 토토 꽁 머니는 가장 일반적인 값 목록입니다. 이를 통해 개별 열에 대해 매우 정확한 추정치가 가능하지만 여러 열의 조건에 따라 쿼리에 대해 상당한 오해가 발생할 수 있습니다..
그러한 추정치를 개선하려면분석
열의 조합에서 MCV 목록을 수집 할 수 있습니다. 기능적 종속성 및 N- 정화 계수와 마찬가지로 가능한 모든 열 그룹에 대해이를 수행하는 것이 비현실적입니다. 이 경우 MCV 목록 (기능적 종속성 및 N- 결정 계수와 달리)이 공통 열 값을 저장하기 때문에 더욱 그렇습니다. 따라서 데이터는로 정의 된 통계 객체에 함께 나타나는 열의 그룹에 대해서만 수집됩니다.MCV
옵션.
이전 예를 계속하면 우편 번호 테이블의 MCV 목록은 다음과 같을 수 있습니다 (간단한 통계 유형과 달리 MCV 목차를 검사하는 데 필요한 기능이 필요합니다) :.
도시에서 State, Zipcodes의 상태; zipcodes 분석; m.*에서 pg_statistic_ext join pg_statistic_ext_data on (oid = stxoid), pg_mcv_list_items (stxdmcv) m 여기서 stxname = 'stts3'; 인덱스 | 값 | 널스 | 주파수 | base_frequency -------+------------------------------------------------------------------------------------------------------ 0 | 워싱턴, DC | f, f | 0.003467 | 2.7E-05 1 | apo, ae | f, f | 0.003067 | 1.9E-05 2 | 휴스턴, TX | f, f | 0.002167 | 0.000133 3 | el paso, tx | f, f | 0.002 | 0.000113 4 | New York, NY | f, f | 0.001967 | 0.000114 5 | Atlanta, GA | f, f | 0.001633 | 3.3E-05 6 | 새크라멘토, CA | f, f | 0.001433 | 7.8E-05 7 | Miami, FL | f, f | 0.0014 | 6E-05 8 | Dallas, TX | f, f | 0.001367 | 8.8E-05 9 | Chicago, IL | f, f | 0.001333 | 5.1E-05 ... (99 줄)
이것은 도시와 주의 가장 일반적인 조합이 DC의 워싱턴이며 실제 빈도 (샘플에서) 약 0.35%임을 나타냅니다. 조합의 기본 주파수 (단순한 콜럼 당 주파수로부터 계산 된 바와 같이)는 0.0027%에 불과하므로 두 가지 순서가 낮습니다..
생성하는 것이 좋습니다MCV토토 꽁 머니 객체는 실제로 조건에서 실제로 사용되는 열의 조합과 그룹 수의 오해가 나쁜 계획을 초래하는 열의 조합에만 해당됩니다. 그렇지 않으면분석
및 계획주기가 낭비됩니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면