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