이전 섹션에서 본 것처럼 쿼리 플래너는 다음을 수행해야 합니다. 쿼리를 통해 검색된 행 수를 추정합니다. 좋은 쿼리 계획 선택. 이 섹션에서는 간략한 개요를 제공합니다. 시스템이 이러한 추정에 사용하는 통계에 따라.
통계의 한 구성요소는 총 항목 수입니다 각 테이블과 인덱스의 디스크 블록 수 각 테이블과 인덱스가 차지합니다. 이 정보는 다음 위치에 보관됩니다.pg_class'sreltuples그리고relpages열. 우리는 그것을 볼 수 있습니다 이와 유사한 쿼리:
regression=# pg_class에서 relname, relkind, reltules, relpages 선택
회귀-# WHERE relname LIKE 'tenk1%';
이름 | 친척 | 렐튜플스 | 다시 페이지
---------------+---------+------------+----------
텐크1 | r | 10000 | 233
tenk1_hundred | 나 | 10000 | 30
tenk1_unique1 | 나 | 10000 | 30
tenk1_unique2 | 나 | 10000 | 30
(4행)
여기에서 볼 수 있습니다.tenk1인덱스와 마찬가지로 10000개의 행을 포함하지만 인덱스는 (당연히) 테이블보다 훨씬 작습니다.
효율성상의 이유로,reltuples그리고relpages업데이트되지 않았습니다. 즉석에서 이루어지므로 일반적으로 대략적인 값만 포함됩니다. (기획자의 목적에 충분합니다). 그들은 더미 값으로 초기화됨(현재 1000 및 10 각각) 테이블이 생성될 때. 그들은 다음에 의해 업데이트됩니다. 현재 특정 명령진공, 분석및만들기 인덱스. 독립형분석그건 의 일부가 아닙니다.진공, 생성 대략적인reltuples이후의 가치 테이블의 모든 행을 읽지는 않습니다.
대부분의 쿼리는 테이블 행의 일부만 검색합니다. 가지고 있기 때문에어디절 검사할 행을 제한합니다. 기획자는 이렇게 해야 한다. 의 추정치선택성의어디절, 즉 의 각 절과 일치하는 행어디조건. 이 작업에 사용되는 정보는pg_statistic시스템 카탈로그. 항목 에서pg_statistic업데이트 대상:분석그리고진공 분석명령이며, 다음 경우에도 항상 근사치입니다. 새로 업데이트되었습니다.
보기보다는pg_statistic직접적으로 그 모습을 보는 것이 더 좋습니다pg_stats배트맨 토토를 조사할 때 수동으로.pg_stats다음과 같이 설계되었습니다. 더 쉽게 읽을 수 있습니다. 게다가pg_stats모두가 읽을 수 있는 반면pg_statistic수퍼유저만 읽을 수 있습니다. (이것은 권한이 없는 사용자가 무엇인가를 배우는 것을 방지합니다. 배트맨 토토에서 다른 사람의 테이블 내용.pg_stats보기가 표시되도록 제한되었습니다. 현재 사용자가 읽을 수 있는 테이블에 대한 행만.) 예를 들어 다음과 같이 할 수 있습니다.
regression=# SELECT attname, n_distinct, Most_common_vals FROM pg_stats WHERE tablename = 'road'; 이름 | n_distinct | 가장_공통_발 ----------------------+------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 이름 | -0.467008 | "I- 580 램프","I- 880 램프","Sp 철도","I- 580","I- 680 램프","I- 80 램프","14th St","5th St","Mission Blvd","I- 880" 경로 | 20 | "[(-122.089,37.71),(-122.0886,37.711)]"
테이블 10-1다음에 존재하는 열을 표시합니다.pg_stats.
표 10-1.pg_stats열
| 이름 | 유형 | 설명 |
|---|---|---|
| 테이블 이름 | 이름 | 열이 포함된 테이블의 이름 |
| attname | 이름 | 이 행에서 설명하는 열 |
| null_frac | 진짜 | 널인 열 항목의 비율 |
| avg_width | 정수 | 열 항목의 평균 너비(바이트) |
| n_distinct | 진짜 | 0보다 크면 예상되는 열의 고유한 값입니다. 0보다 작으면, 고유 값 수를 다음으로 나눈 값의 음수 행 수. (부정형은 다음과 같은 경우에 사용됩니다.분석다음의 수가 있다고 믿습니다. 테이블이 커짐에 따라 고유 값도 증가할 가능성이 높습니다. 열에 다음이 있는 것처럼 보일 때 긍정적인 형식이 사용됩니다. 고정된 수의 가능한 값.) 예: -1 고유한 개수가 있는 고유 열을 나타냅니다. 값은 행 수와 같습니다. |
| most_common_vals | 텍스트[] | 열에서 가장 일반적인 값의 목록입니다. (어떤 값보다 더 흔한 값이 없으면 생략됩니다. 기타.) |
| most_common_freqs | 진짜[] | 가장 일반적인 값의 빈도 목록, 즉, 각각의 발생 횟수를 총계로 나눈 것입니다. 행 수입니다. |
| 히스토그램_바운드 | 텍스트[] | 열의 값을 다음과 같이 나누는 값 목록입니다. 인구가 거의 같은 그룹.most_common_vals, 존재하는 경우 히스토그램 계산에서는 생략되었습니다. (다음의 경우 생략 열 데이터 유형에이 없습니다.<연산자 또는 다음과 같은 경우most_common_vals다음 계정을 나열합니다. 전체 인구.) |
| 상관관계 | 진짜 | 물리적 행 순서 간의 통계적 상관관계 열 값의 논리적 순서. 이 범위 -1에서 +1까지. 값이 -1 또는 +1에 가까울 때 인덱스 열에 대한 스캔은 다음보다 저렴할 것으로 예상됩니다. 0에 가까울 때 랜덤 액세스 감소로 인해 디스크에. (컬럼 데이터형이 없으면 생략<연산자.) |
다음의 최대 항목 수most_common_vals그리고히스토그램_바운드어레이는 를 배트맨 토토여 열 단위로테이블 변경 배트맨 토토 설정명령. 현재 기본 제한은 10입니다. 항목. 한도를 높이면 더 정확한 플래너가 가능해질 수 있습니다. 특히 불규칙한 기둥의 경우 추정치가 작성됩니다. 더 많은 공간을 소비하는 대가로 데이터 배포pg_statistic그리고 약간 더 많은 시간 추정치를 계산합니다. 반대로 하한선은 다음과 같을 수 있습니다. 단순한 데이터 분포를 갖는 열에 적합합니다.