이전 섹션에서 보았듯이 쿼리 플래너는 다음을 수행해야 합니다. 쿼리를 통해 검색된 행 수를 추정합니다. 좋은 쿼리 계획 선택. 이 섹션에서는 간략한 개요를 제공합니다. 시스템이 이러한 추정에 사용하는 통계에 따라.
통계의 한 구성요소는 총 항목 수입니다 각 테이블과 인덱스의 디스크 블록 수 각 테이블과 인덱스가 차지합니다. 이 정보는 다음 위치에 보관됩니다.pg_class'sreltuples그리고relpages열. 우리는 그것을 볼 수 있습니다 이와 유사한 쿼리:
regression=# pg_class에서 relname, relkind, reltules, relpages 선택
회귀-# 여기서 relname은 '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이후의 가치 테이블의 모든 행을 읽지는 않습니다.
대부분의 쿼리는 테이블 행의 일부만 검색합니다. 행을 제한하는 WHERE 절이 있기 때문에 검사. 따라서 기획자는 다음을 추정해야 합니다.선택성WHERE 절의 즉, WHERE의 각 절과 일치하는 행의 비율 조건. 이 작업에 사용되는 정보는pg_statistic시스템 카탈로그. 항목 에서pg_statistic업데이트 대상:분석그리고진공 분석명령이며, 다음 경우에도 항상 근사치입니다. 새로 업데이트되었습니다.
보기보다는pg_statistic직접적으로 그 모습을 보는 것이 더 좋습니다pg_stats토토 핫를 조사할 때 수동으로.pg_stats다음과 같이 설계되었습니다. 더 쉽게 읽을 수 있습니다. 게다가pg_stats모두가 읽을 수 있는 반면pg_statistic수퍼유저만 읽을 수 있습니다. (이것은 권한이 없는 사용자가 무엇인가를 배우는 것을 방지합니다. 토토 핫에서 다른 사람의 테이블 내용.pg_stats보기가 표시되도록 제한되었습니다. 현재 사용자가 읽을 수 있는 테이블에 대한 행만.) 예를 들어 다음과 같이 할 수 있습니다.
regression=# pg_stats에서 attname, n_distinct, Most_common_vals 선택 여기서 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)]"
현재PostgreSQL7.2 다음 열이 있습니다.pg_stats:
표 11-1.pg_stats열
| 이름 | 유형 | 설명 |
|---|---|---|
| 테이블 이름 | 이름 | 열을 포함하는 테이블 이름 |
| attname | 이름 | 이 행에서 설명하는 열 |
| null_frac | 진짜 | NULL인 열 항목의 비율 |
| avg_width | 정수 | 열 항목의 평균 너비(바이트) |
| n_distinct | 진짜 | 0보다 크면 예상되는 열의 고유한 값입니다. 0보다 작으면, 고유 값 수를 다음으로 나눈 값의 음수 행 수. (부정형은 ANALYZE일 때 사용됩니다. 고유한 값의 수가 다음과 같을 것이라고 믿습니다. 테이블이 커지면 증가합니다. 긍정적인 형태가 사용된다 열에 가능한 개수가 고정되어 있는 것 같을 때 값.) 예를 들어, -1은 다음의 고유 열을 나타냅니다. 고유 값의 개수는 다음과 같습니다. 행 수입니다. |
| most_common_vals | 텍스트[] | 열에서 가장 일반적인 값의 목록입니다. (어떤 값보다 더 흔한 값이 없으면 생략됩니다. 기타.) |
| most_common_freqs | 진짜[] | 가장 일반적인 값의 빈도 목록, 즉, 각각의 발생 횟수를 총 횟수로 나눈 것입니다. 행. |
| 히스토그램_바운드 | 텍스트[] | 열의 값을 다음으로 나누는 값 목록입니다. 인구가 거의 같은 그룹.most_common_vals, 존재하는 경우 히스토그램 계산에서는 생략되었습니다. (다음의 경우 생략 열 데이터 유형에이 없습니다.<연산자 또는 다음과 같은 경우most_common_vals다음 계정을 나열합니다. 전체 인구.) |
| 상관관계 | 진짜 | 물리적 행 순서 간의 통계적 상관관계 열 값의 논리적 순서. 이 범위 -1에서 +1까지. 값이 -1 또는 +1에 가까울 때 인덱스 열에 대한 스캔은 다음보다 저렴할 것으로 예상됩니다. 0에 가까울 때 랜덤 액세스 감소로 인해 디스크에. (컬럼 데이터형이 없으면 생략<연산자.) |
다음의 최대 항목 수most_common_vals그리고히스토그램_바운드어레이는 를 토토 핫여 열 단위로테이블 변경 토토 핫 설정명령. 현재 기본 제한은 10입니다. 항목. 한도를 높이면 더 정확한 플래너가 가능해질 수 있습니다. 특히 불규칙한 기둥의 경우 추정치가 작성됩니다. 더 많은 공간을 소비하는 대가로 데이터 배포pg_statistic그리고 약간 더 많은 시간 추정치를 계산합니다. 반대로 하한선은 다음과 같을 수 있습니다. 단순한 데이터 분포를 갖는 열에 적합합니다.