그토토모듈은 서버에서 실행되는 모든 SQL 문의 실행 통계를 추적하는 수단을 제공합니다.
모듈을 추가하여 로드해야 합니다.토토에shared_preload_librariesin토토.conf, 추가 공유 메모리가 필요하기 때문입니다. 이는 모듈을 추가하거나 제거하려면 서버를 다시 시작해야 함을 의미합니다.
언제토토이 로드되면 서버의 모든 데이터베이스에 대한 통계를 추적합니다. 이러한 통계에 액세스하고 조작하기 위해 모듈은 뷰를 제공합니다.토토및 유틸리티 함수토토_reset그리고토토112PostgreSQL: 문서: 11: F.29. 토토28확장 프로그램 생성 토토.
토토보기모듈에 의해 수집된 통계는 이름이 지정된 보기를 통해 사용할 수 있습니다.토토. 이 보기에는 각각의 개별 데이터베이스 ID, 사용자 ID 및 쿼리 ID에 대해 하나의 행이 포함됩니다(모듈이 추적할 수 있는 최대 개별 명령문 수까지). 뷰의 열은 다음과 같습니다.표 F.21.
표 F.21. 토토열
| 이름 | 유형 | 참고자료 | 설명 |
|---|---|---|---|
사용자 ID |
oid |
|
명령문을 실행한 사용자의 OID |
dbid |
oid |
|
명령문이 실행된 데이터베이스의 OID |
쿼리ID |
bigint |
문의 구문 분석 트리에서 계산된 내부 해시 코드 | |
질의 |
텍스트 |
대표 성명서 내용 | |
호출 |
비긴트 |
실행 횟수 | |
total_time |
배정밀도 |
문장에서 소요된 총 시간(밀리초) | |
min_time |
배정밀도 |
문에 소요된 최소 시간(밀리초) | |
최대_시간 |
배정밀도 |
문에서 소요된 최대 시간(밀리초) | |
평균시간 |
배정밀도 |
문장에 소요된 평균 시간(밀리초) | |
stddev_time |
배정밀도 |
문장에서 소요된 시간의 모집단 표준편차(밀리초) | |
행 |
비긴트 |
검색된 총 행 수 또는 명령문에 의해 영향을 받은 행 수 | |
shared_blks_hit |
비긴트 |
문에 의한 공유 블록 캐시 적중의 총 수 | |
shared_blks_read |
비긴트 |
문이 읽은 공유 블록의 총 개수 | |
shared_blks_dirtied |
비진트 |
문에 의해 더러워진 공유 블록의 총 수 | |
shared_blks_write |
비긴트 |
문에 의해 작성된 공유 블록의 총 수 | |
local_blks_hit |
비긴트 |
문에 의한 로컬 블록 캐시 적중의 총 수 | |
local_blks_read |
비긴트 |
문이 읽은 로컬 블록의 총 수 | |
local_blks_dirtied |
bigint |
문에 의해 더러워진 로컬 블록의 총 수 | |
local_blks_write |
비긴트 |
문에 의해 작성된 총 로컬 블록 수 | |
temp_blks_read |
비긴트 |
문이 읽은 임시 블록의 총 개수 | |
temp_blks_write |
비긴트 |
문에 의해 작성된 총 임시 블록 수 | |
blk_read_time |
배정밀도 |
문이 블록을 읽는 데 소요된 총 시간(밀리초 단위)(iftrack_io_timing활성화됨, 그렇지 않으면 0) | |
blk_write_time |
배정밀도 |
명령어가 블록을 쓰는 데 소요된 총 시간(밀리초 단위)(iftrack_io_timing활성화됨, 그렇지 않으면 0) |
보안상의 이유로 수퍼유저와 회원만pg_read_all_stats역할은 SQL 텍스트를 볼 수 있으며쿼리ID19750_19883
계획 가능한 쿼리(즉,선택, 삽입, 업데이트및삭제)는 단일로 결합됩니다.토토내부 해시 계산에 따라 동일한 쿼리 구조를 가질 때마다 항목입니다. 일반적으로 쿼리에 나타나는 리터럴 상수 값을 제외하고 의미상 동일한 두 쿼리는 이 목적에서 동일한 것으로 간주됩니다. 그러나 유틸리티 명령(즉, 다른 모든 명령)은 텍스트 쿼리 문자열을 기준으로 엄격하게 비교됩니다.
쿼리를 다른 쿼리와 일치시키기 위해 상수 값이 무시되면 상수는 다음과 같은 매개변수 기호로 대체됩니다.$1,에서토토디스플레이. 쿼리 텍스트의 나머지 부분은 특정쿼리ID다음과 관련된 해시 값토토항목.
어떤 경우에는 눈에 띄게 다른 텍스트가 포함된 쿼리가 단일로 병합될 수 있습니다.토토항목. 일반적으로 이는 의미상 동일한 쿼리에 대해서만 발생하지만 해시 충돌로 인해 관련 없는 쿼리가 하나의 항목으로 병합될 가능성이 적습니다. (단, 다른 사용자나 데이터베이스에 속한 쿼리의 경우에는 이런 일이 발생할 수 없습니다.)
이후쿼리ID해시 값은 쿼리의 분석 후 표현에서 계산됩니다. 그 반대도 가능합니다. 동일한 텍스트가 포함된 쿼리가 서로 다른 요소로 인해 다른 의미를 갖는 경우 별도의 항목으로 나타날 수 있습니다.검색_경로설정.
소비자토토사용을 원할 수도 있음쿼리ID(아마도 함께dbid그리고사용자 ID)을 쿼리 텍스트보다 각 항목에 대해 더 안정적이고 신뢰할 수 있는 식별자로 사용합니다. 그러나 안정성에 대한 보장은 제한적이라는 점을 이해하는 것이 중요합니다.쿼리ID해시 값. 식별자는 분석 후 트리에서 파생되므로 그 값은 무엇보다도 이 표현에 나타나는 내부 객체 식별자의 함수입니다. 이는 직관에 반하는 의미를 갖습니다. 예를 들어,토토두 개의 쿼리 실행 사이에 삭제되고 다시 생성된 테이블을 참조하는 경우 두 개의 명백히 동일한 쿼리가 서로 다른 쿼리로 간주됩니다. 해싱 프로세스는 머신 아키텍처와 플랫폼의 다른 측면의 차이에도 민감합니다. 또한 다음과 같이 가정하는 것은 안전하지 않습니다.쿼리ID다음의 주요 버전에서 안정적입니다.포스트그레SQL.
어림짐작으로 볼 때,쿼리ID값은 기본 서버 버전과 카탈로그 메타데이터 세부정보가 정확히 동일하게 유지되는 경우에만 안정적이고 비교할 수 있다고 가정할 수 있습니다. 물리적 WAL 재생을 기반으로 복제에 참여하는 두 서버는 동일할 것으로 예상할 수 있습니다.쿼리ID동일한 쿼리에 대한 값입니다. 그러나 논리적 복제 체계는 모든 관련 세부 사항에서 복제본을 동일하게 유지한다고 약속하지 않으므로쿼리ID논리적 복제본 집합에 걸쳐 비용을 누적하는 데 유용한 식별자는 아닙니다. 의심스러운 경우 직접 테스트하는 것이 좋습니다.
대표 쿼리 텍스트에서 상수를 대체하는 데 사용되는 매개변수 기호는 가장 높은 다음 숫자부터 시작합니다.$n원래 쿼리 텍스트의 매개변수 또는$1아무것도 없었다면. 어떤 경우에는 이 번호 매기기에 영향을 미치는 숨겨진 매개변수 기호가 있을 수 있다는 점은 주목할 가치가 있습니다. 예를 들어,PL/pgSQL숨겨진 매개변수 기호를 사용하여 함수 로컬 변수의 값을 쿼리에 삽입하므로 aPL/pgSQL다음과 같은 진술SELECT i + 1 INTO j다음과 같은 대표 텍스트가 있을 것입니다.선택 i + $2.
대표 쿼리 텍스트는 외부 디스크 파일에 보관되며 공유 메모리를 소모하지 않습니다. 따라서 매우 긴 쿼리 텍스트도 성공적으로 저장할 수 있습니다. 그러나 긴 쿼리 텍스트가 많이 누적되면 외부 파일이 감당할 수 없을 정도로 커질 수 있습니다. 그런 경우의 회복 방법으로,토토쿼리 텍스트를 삭제하도록 선택할 수 있으며 그 결과에 있는 모든 기존 항목은토토보기에는 null이 표시됩니다.질의필드(각 필드와 연관된 통계 포함)쿼리ID보존됩니다. 이런 일이 발생하면 줄이는 것을 고려해 보세요.토토.max재발을 방지하기 위해.
토토_reset()이 void를 반환함 토토_reset지금까지 수집된 모든 통계를 삭제합니다.토토. 기본적으로 이 기능은 슈퍼유저만 실행할 수 있습니다.
토토(showtext boolean)는 레코드 세트를 반환합니다. 그토토view는 이름이 지정된 함수로 정의됩니다.토토. 클라이언트가 다음을 호출하는 것이 가능합니다.토토직접 기능하고 지정하여showtext := false쿼리 텍스트를 생략합니다(즉,아웃뷰에 해당하는 인수질의열은 null을 반환합니다). 이 기능은 불확실한 길이의 쿼리 텍스트를 반복적으로 검색하는 오버헤드를 방지하려는 외부 도구를 지원하기 위한 것입니다. 대신 이러한 도구는 각 항목 자체에 대해 관찰된 첫 번째 쿼리 텍스트를 캐시할 수 있습니다. 그게 전부이기 때문입니다.토토자체가 수행하고 필요한 경우에만 쿼리 텍스트를 검색합니다. 서버는 쿼리 텍스트를 파일에 저장하므로 이 접근 방식은 반복적인 검사를 위한 물리적 I/O를 줄일 수 있습니다.토토데이터.
토토.max (정수)토토.max은 모듈이 추적하는 최대 명령문 수입니다(즉,토토보기). 그보다 더 뚜렷한 문이 관찰되면 가장 적게 실행된 문에 대한 정보가 삭제됩니다. 기본값은 5000입니다. 이 매개변수는 서버 시작 시에만 설정할 수 있습니다.
토토.track (열거형)토토.track모듈이 계산하는 명령문을 제어합니다. 지정하다맨 위로최상위 명세서(클라이언트가 직접 발행한 명세서)를 추적하기 위해,모두또한 중첩된 문(예: 함수 내에서 호출된 문)을 추적하거나없음문 통계 수집을 비활성화합니다. 기본값은맨 위로. 슈퍼유저만 이 설정을 변경할 수 있습니다.
토토.track_utility (부울)토토.track_utility모듈이 유틸리티 명령을 추적하는지 여부를 제어합니다. 유틸리티 명령은 다음을 제외한 모든 명령입니다.선택, 삽입, 업데이트그리고삭제. 기본값은켜짐. 슈퍼유저만 이 설정을 변경할 수 있습니다.
토토.save (부울)토토.save서버 종료 시 명령문 통계를 저장할지 여부를 지정합니다. 그렇다면꺼짐그러면 통계는 종료 시 저장되지 않으며 서버 시작 시 다시 로드되지 않습니다. 기본값은켜짐. 이 매개변수는에서만 설정할 수 있습니다.토토.conf파일 또는 서버 명령줄에서.
모듈에는 비례하여 추가 공유 메모리가 필요합니다.토토.max. 이 메모리는 모듈이 로드될 때마다 소비됩니다.토토.track다음으로 설정됨없음.
이 매개변수는 다음에서 설정되어야 합니다.토토.conf. 일반적인 사용법은 다음과 같습니다:
# 토토.conf shared_preload_libraries = '토토' 토토.max = 10000 토토.track = 모두
bench=# SELECT 토토_reset();
$ pgbench -i 벤치
$ pgbench -c10 -t300 벤치
벤치=# \x
벤치=# SELECT 쿼리, 호출, total_time, 행, 100.0 * shared_blks_hit /
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
FROM 토토 ORDER BY total_time DESC LIMIT 5;
-[ 기록 1 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2;
전화 | 3000
총_시간 | 9609.00100000002
행 | 2836
히트_퍼센트 | 99.9778970000200936
-[ 기록 2 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2;
전화 | 3000
총_시간 | 8015.156
행 | 2990
히트_퍼센트 | 99.9731126579631345
-[ 기록 3 ]---------------------------------------------------------
쿼리 | stdin에서 pgbench_accounts 복사
전화 | 1
총_시간 | 310.624
행 | 100000
히트_퍼센트 | 0.30395136778115501520
-[ 기록 4 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_accounts SET abalance = abalance + $1 WHERE 보조 = $2;
전화 | 3000
총_시간 | 271.741999999997
행 | 3000
히트_퍼센트 | 93.7968855088209426
-[ 기록 5 ]---------------------------------------------------------
쿼리 | 테이블 변경 pgbench_accounts 기본 키 추가(지원)
전화 | 1
총_시간 | 81.42
행 | 0
히트_퍼센트 | 34.4947735191637631
이타가키 타카히로<itagaki.takahiro@oss.ntt.co.jp. Peter Geoghegan이 추가한 쿼리 정규화<peter@2ndquadrant.com.