그토토 결과모듈은 서버에서 실행되는 모든 SQL 문의 실행 통계를 추적하는 수단을 제공합니다.
모듈을 추가하여 로드해야 합니다.토토 결과에shared_preload_librariesinpostgresql.conf, 추가 공유 메모리가 필요하기 때문입니다. 이는 모듈을 추가하거나 제거하려면 서버를 다시 시작해야 함을 의미합니다.
언제토토 결과이 로드되면 서버의 모든 데이터베이스에 대한 통계를 추적합니다. 이러한 통계에 액세스하고 조작하기 위해 모듈은 뷰를 제공합니다.토토 결과및 유틸리티 함수토토 결과_reset그리고토토 결과112PostgreSQL: 문서: 12: 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.
물리적 WAL 재생을 기반으로 복제에 참여하는 두 서버는 동일할 것으로 예상할 수 있습니다.쿼리ID동일한 쿼리에 대한 값입니다. 그러나 논리적 복제 체계는 모든 관련 세부 사항에서 복제본을 동일하게 유지한다고 약속하지 않으므로쿼리ID논리적 복제본 집합에 걸쳐 비용을 누적하는 데 유용한 식별자는 아닙니다. 의심스러운 경우 직접 테스트하는 것이 좋습니다.
일반적으로 다음과 같이 가정할 수 있습니다.쿼리ID값은 부 버전 릴리스 간에 안정적입니다.PostgreSQL, 인스턴스가 동일한 머신 아키텍처에서 실행되고 있고 카탈로그 메타데이터 세부정보가 일치하는 경우입니다. 호환성은 최후의 수단으로 부 버전 간에만 중단됩니다.
대표 쿼리 텍스트에서 상수를 대체하는 데 사용되는 매개변수 기호는 가장 높은 다음 숫자부터 시작합니다.$n원래 쿼리 텍스트의 매개변수 또는$1아무것도 없었다면. 어떤 경우에는 이 번호 매기기에 영향을 미치는 숨겨진 매개변수 기호가 있을 수 있다는 점은 주목할 가치가 있습니다. 예를 들어,PL/pgSQL숨겨진 매개변수 기호를 사용하여 함수 로컬 변수의 값을 쿼리에 삽입하므로 aPL/pgSQL다음과 같은 진술SELECT i + 1 INTO j다음과 같은 대표 텍스트가 있을 것입니다.선택 i + $2.
대표 쿼리 텍스트는 외부 디스크 파일에 보관되며 공유 메모리를 소비하지 않습니다. 따라서 매우 긴 쿼리 텍스트도 성공적으로 저장할 수 있습니다. 그러나 긴 쿼리 텍스트가 많이 누적되면 외부 파일이 감당할 수 없을 정도로 커질 수 있습니다. 그런 경우의 회복 방법으로,토토 결과쿼리 텍스트를 삭제하도록 선택할 수 있으며 그 결과에 있는 모든 기존 항목은토토 결과보기에는 null이 표시됩니다.질의필드(각 필드와 연관된 통계 포함)쿼리ID보존됩니다. 이런 일이 발생하면 줄이는 것을 고려해 보세요.토토 결과.max재발을 방지하기 위해.
토토 결과_reset(userid Oid, dbid Oid, queryid bigint)가 void를 반환함 토토 결과_reset지금까지 수집된 통계를 삭제합니다.토토 결과지정된 항목에 해당사용자 ID, dbid그리고쿼리ID. 매개변수 중 하나라도 지정되지 않은 경우 기본값은026252_264210(잘못됨), 모든 통계가 삭제됩니다. 기본적으로 이 기능은 슈퍼유저만 실행할 수 있습니다. 다음을 사용하여 다른 사람에게 액세스 권한을 부여할 수 있습니다.그랜트.
토토 결과(showtext boolean)는 레코드 세트를 반환합니다. 그토토 결과뷰는 이름이 지정된 함수로 정의됩니다.토토 결과. 클라이언트가 다음을 호출하는 것이 가능합니다.토토 결과직접 기능하고 지정하여showtext := false쿼리 텍스트를 생략합니다(즉,아웃뷰에 해당하는 인수질의열은 null을 반환합니다). 이 기능은 불확실한 길이의 쿼리 텍스트를 반복적으로 검색하는 오버헤드를 방지하려는 외부 도구를 지원하기 위한 것입니다. 대신 이러한 도구는 각 항목 자체에 대해 관찰된 첫 번째 쿼리 텍스트를 캐시할 수 있습니다. 그게 전부이기 때문입니다.토토 결과자체가 수행하고 필요한 경우에만 쿼리 텍스트를 검색합니다. 서버는 쿼리 텍스트를 파일에 저장하므로 이 접근 방식은 반복적인 검사를 위한 물리적 I/O를 줄일 수 있습니다.토토 결과데이터.
토토 결과.max (정수)토토 결과.max은 모듈이 추적하는 최대 명령문 수입니다(즉,토토 결과보기). 그보다 더 뚜렷한 문이 관찰되면 가장 적게 실행된 문에 대한 정보가 삭제됩니다. 기본값은 5000입니다. 이 매개변수는 서버 시작 시에만 설정할 수 있습니다.
토토 결과.track (열거형)토토 결과.track모듈이 계산하는 명령문을 제어합니다. 지정하다맨 위로최상위 명세서(클라이언트가 직접 발행한 명세서)를 추적하기 위해,전체또한 중첩된 문(예: 함수 내에서 호출된 문)을 추적하거나없음문 통계 수집을 비활성화합니다. 기본값은맨 위로. 슈퍼유저만 이 설정을 변경할 수 있습니다.
토토 결과.track_utility (부울)토토 결과.track_utility모듈이 유틸리티 명령을 추적하는지 여부를 제어합니다. 유틸리티 명령은 다음을 제외한 모든 명령입니다.선택, 삽입, 업데이트그리고삭제. 기본값은켜짐. 슈퍼유저만 이 설정을 변경할 수 있습니다.
토토 결과.save (부울)토토 결과.save서버 종료 시 명령문 통계를 저장할지 여부를 지정합니다. 그렇다면꺼짐그러면 통계는 종료 시 저장되지 않으며 서버 시작 시 다시 로드되지 않습니다. 기본값은켜짐. 이 매개변수는에서만 설정할 수 있습니다.postgresql.conf파일 또는 서버 명령줄에서.
모듈에는 다음에 비례하는 추가 공유 메모리가 필요합니다.토토 결과.max. 이 메모리는 모듈이 로드될 때마다 소비됩니다.토토 결과.track다음으로 설정됨없음.
이 매개변수는 다음에서 설정되어야 합니다.postgresql.conf. 일반적인 사용법은 다음과 같습니다:
# postgresql.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
총_시간 | 25565.855387
행 | 3000
히트_퍼센트 | 100.0000000000000000
-[ 기록 2 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2
전화 | 3000
총_시간 | 20756.669379
행 | 3000
히트_퍼센트 | 100.0000000000000000
-[ 기록 3 ]---------------------------------------------------------
쿼리 | stdin에서 pgbench_accounts를 복사하세요.
전화 | 1
총_시간 | 291.865911
행 | 100000
히트_퍼센트 | 100.0000000000000000
-[ 기록 4 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_accounts SET abalance = abalance + $1 WHERE 지원 = $2
전화 | 3000
총_시간 | 271.232977
행 | 3000
히트_퍼센트 | 98.5723926698852723
-[ 기록 5 ]---------------------------------------------------------
쿼리 | 테이블 변경 pgbench_accounts 기본 키 추가(지원)
전화 | 1
총_시간 | 160.588563
행 | 0
히트_퍼센트 | 100.0000000000000000
벤치=# SELECT 토토 결과_reset(0,0,s.queryid) FROM 토토 결과 AS s
WHERE s.query = 'pgbench_branches SET 업데이트 bbalance = bbalance + $1 WHERE bid = $2';
벤치=# 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_tellers SET tbalance = tbalance + $1 WHERE tid = $2
전화 | 3000
총_시간 | 20756.669379
행 | 3000
히트_퍼센트 | 100.0000000000000000
-[ 기록 2 ]---------------------------------------------------------
쿼리 | stdin에서 pgbench_accounts를 복사하세요.
전화 | 1
총_시간 | 291.865911
행 | 100000
히트_퍼센트 | 100.0000000000000000
-[ 기록 3 ]---------------------------------------------------------
쿼리 | 업데이트 pgbench_accounts SET abalance = abalance + $1 WHERE 지원 = $2
전화 | 3000
총_시간 | 271.232977
행 | 3000
히트_퍼센트 | 98.5723926698852723
-[ 기록 4 ]---------------------------------------------------------
쿼리 | 테이블 변경 pgbench_accounts 기본 키 추가(지원)
전화 | 1
총_시간 | 160.588563
행 | 0
히트_퍼센트 | 100.0000000000000000
-[ 기록 5 ]---------------------------------------------------------
쿼리 | 진공 분석 pgbench_accounts
전화 | 1
총_시간 | 136.448116
행 | 0
히트_퍼센트 | 99.9201915403032721
벤치=# SELECT 토토 결과_reset(0,0,0);
벤치=# 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 ]----------------------------
쿼리 | 토토 결과_reset(0,0,0) 선택
전화 | 1
총_시간 | 0.189497
행 | 1
hit_percent |
이타가키 다카히로<itagaki.takahiro@oss.ntt.co.jp. Peter Geoghegan이 추가한 쿼리 정규화<peter@2ndquadrant.com.