SYS_QUERY_HISTORY를 사용하여 사용자 쿼리의 세부 정보를 봅니다. 각 행은 일부 필드에 대한 누적 통계가 있는 사용자 쿼리를 나타냅니다. 이 보기에는 데이터 정의 언어(DDL), 데이터 조작 언어(DML), 복사, 언로드 및 Amazon Redshift Spectrum과 같은 다양한 유형의 쿼리가 포함되어 있습니다. 여기에는 실행 중인 쿼리와 완료된 쿼리가 모두 포함됩니다.
SYS_QUERY_HISTORY는 모든 사용자에게 표시됩니다. 수퍼유저는 모든 행을 볼 수 있지만 일반 사용자는 자체 데이터만 볼 수 있습니다. 자세한 내용은 시스템 테이블 및 뷰에 있는 데이터의 가시성 섹션을 참조하세요.
테이블 열
열 명칭 | 데이터 유형 | 설명 |
---|---|---|
user_id | 정수 | 쿼리를 제출한 사용자의 식별자입니다. |
query_id | bigint | 쿼리 식별자입니다. |
query_label | character(320) | 쿼리의 짧은 이름입니다. |
transaction_id | bigint | 트랜잭션 식별자입니다. |
session_id | 정수 | 쿼리를 실행하는 프로세스의 프로세스 식별자입니다. |
database_name | character(128) | 쿼리가 실행되었을 때 사용자가 연결된 데이터베이스의 이름. |
query_type | character(32) | SELECT, INSERT, UPDATE, UNLOAD COPY, COMMAND, DDL, UTILITY, CTAS, OTHER 등의 쿼리 유형입니다. |
status | character(10) | 쿼리의 상태입니다. 유효한 값: 계획 중, 대기됨, 실행 중, 반환 중, 실패, 취소됨 및 성공. |
result_cache_hit | 불 | 쿼리가 결과 캐시와 일치하는지를 나타냅니다. |
start_time | 타임스탬프 | 쿼리가 시작된 시간입니다. |
end_time | 타임스탬프 | 쿼리가 완료된 시간입니다. |
경과 시간 | bigint | 쿼리에 소요된 총 시간(마이크로초)입니다. |
queue_time | bigint | 서비스 클래스 쿼리 대기열에 소요된 총 시간(마이크로초)입니다. |
execution_time | bigint | 서비스 클래스에서 실행 중인 총 시간(마이크로초)입니다. |
error_message | character(512) | 쿼리가 실패한 이유입니다. |
returned_rows | bigint | 클라이언트에게 반환되는 행 수입니다. |
returned_bytes | bigint | 클라이언트에게 반환되는 바이트 수입니다. |
query_text | character(4000) | 쿼리 문자열. 이 문자열은 잘릴 수 있습니다. |
redshift_version | character(256) | 쿼리가 실행된 Amazon Redshift 버전입니다. |
usage_limit | character(150) | 쿼리에서 도달한 사용량 제한 ID의 목록입니다. |
compute_type | varchar(32) | 쿼리가 기본 클러스터에서 실행되는지 아니면 동시성 확장 클러스터에서 실행되는지를 나타냅니다. 가능한 값은 primary (기본 클러스터에서 쿼리 실행), secondary (보조 클러스터에서 쿼리 실행) 또는 primary-scale (동시성 클러스터에서 쿼리 실행)입니다. 이는 프로비전된 클러스터에만 적용됩니다. |
compile_time | bigint | 쿼리 컴파일에 소요된 총시간(마이크로초)입니다. |
planning_time | bigint | 쿼리 계획에 소요된 총시간(마이크로초)입니다. |
lock_wait_time | bigint | 관계 잠금을 기다리는 데 소요된 총시간(마이크로초)입니다. |
service_class_id | 정수 | 서비스 클래스 ID입니다. 서비스 클래스 ID의 목록을 보려면 WLM 서비스 클래스 ID 섹션으로 이동하세요. 이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Redshift Serverless에서 실행되는 쿼리의 경우, 이 열에는 -1이 포함됩니다. |
service_class_name | character(64) | 서비스 클래스 이름입니다. 이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Amazon Redshift Redshift Serverless에서 실행되는 쿼리의 경우. 이 열이 비어 있습니다. |
query_priority | character(20) | 쿼리가 실행된 대기열의 우선순위. 가능한 값은 다음과 같습니다.
NULL은 해당 쿼리에 쿼리 우선순위가 지원되지 않음을 의미합니다. 이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Redshift Serverless에서 실행되는 쿼리의 경우. 이 열이 비어 있습니다. |
short_query_accelerated | character(10) | 단기 쿼리 가속화(SQA)를 사용하여 쿼리를 가속했는지 여부. 가능한 값은 다음과 같습니다.
이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Redshift Serverless에서 실행되는 쿼리의 경우. 이 열이 비어 있습니다. |
user_query_hash | character(40) | 쿼리 리터럴을 포함하여 쿼리에서 생성된 쿼리 해시입니다. 동일한 쿼리 텍스트가 포함된 반복 쿼리는 user_query_hash 값이 동일합니다. |
generic_query_hash | character(40) | 쿼리 리터럴을 제외한 쿼리에서 생성된 쿼리 해시입니다. 동일한 쿼리 텍스트가 포함되지만 다른 쿼리 리터럴이 있는 반복 쿼리는 generic_query_hash 값이 동일합니다. |
query_hash_version | 정수 | 쿼리에서 생성된 쿼리 해시의 버전 번호입니다. |
result_cache_query_id | 정수 | 쿼리에 결과 캐싱을 사용한 경우 이 필드 값은 캐시된 결과의 소스인 쿼리의 쿼리 ID입니다. 결과 캐싱을 사용하지 않은 경우 이 필드 값은 |
샘플 쿼리
다음 쿼리는 실행 중인 쿼리와 대기 중인 쿼리를 반환합니다.
SELECT user_id,
query_id,
transaction_id,
session_id,
status,
trim(database_name) AS database_name,
start_time,
end_time,
result_cache_hit,
elapsed_time,
queue_time,
execution_time
FROM sys_query_history
WHERE status IN ('running','queued')
ORDER BY start_time;
샘플 출력은 다음과 같습니다.
user_id | query_id | transaction_id | session_id | status | database_name | start_time | end_time | result_cache_hit | elapsed_time | queue_time | execution_time
---------+----------+----------------+------------+---------+---------------+---------------------------+----------------------------+------------------+--------------+------------+----------------
101 | 760705 | 852337 | 1073832321 | running | tpcds_1t | 2022-02-15 19:03:19.67849 | 2022-02-15 19:03:19.739811 | f | 61321 | 0 | 0
다음 쿼리는 특정 쿼리의 쿼리 시작 시간, 종료 시간, 대기열 시간, 경과 시간, 계획 시간 및 기타 메타데이터를 반환합니다.
SELECT user_id,
query_id,
transaction_id,
session_id,
status,
trim(database_name) AS database_name,
start_time,
end_time,
result_cache_hit,
elapsed_time,
queue_time,
execution_time,
planning_time,
trim(query_text) as query_text
FROM sys_query_history
WHERE query_id = 3093;
샘플 출력은 다음과 같습니다.
user_id | query_id | transaction_id | session_id | status | database_name | start_time | end_time | result_cache_hit | elapsed_time | queue_time | execution_time | planning_time | query_text
--------+----------+----------------+------------+------------+---------------+----------------------------+----------------------------+------------------+--------------+------------+----------------+---------------+-------------------------------------
106 | 3093 | 11759 | 1073750146 | success | dev | 2023-03-16 16:53:17.840214 | 2023-03-16 16:53:18.106588 | f | 266374 | 0 | 105725 | 136589 | select count(*) from item;
다음은 가장 최근 SELECT 쿼리 10개를 나열하는 쿼리입니다.
SELECT query_id,
transaction_id,
session_id,
start_time,
elapsed_time,
queue_time,
execution_time,
returned_rows,
returned_bytes
FROM sys_query_history
WHERE query_type = 'SELECT'
ORDER BY start_time DESC limit 10;
샘플 출력은 다음과 같습니다.
query_id | transaction_id | session_id | start_time | elapsed_time | queue_time | execution_time | returned_rows | returned_bytes
----------+----------------+------------+----------------------------+--------------+------------+----------------+---------------+----------------
526532 | 61093 | 1073840313 | 2022-02-09 04:43:24.149603 | 520571 | 0 | 481293 | 1 | 3794
526520 | 60850 | 1073840313 | 2022-02-09 04:38:27.24875 | 635957 | 0 | 596601 | 1 | 3679
526508 | 60803 | 1073840313 | 2022-02-09 04:37:51.118835 | 563882 | 0 | 503135 | 5 | 17216
526505 | 60763 | 1073840313 | 2022-02-09 04:36:48.636224 | 649337 | 0 | 589823 | 1 | 652
526478 | 60730 | 1073840313 | 2022-02-09 04:36:11.741471 | 14611321 | 0 | 14544058 | 0 | 0
526467 | 60636 | 1073840313 | 2022-02-09 04:34:11.91463 | 16711367 | 0 | 16633767 | 1 | 575
511617 | 617946 | 1074009948 | 2022-01-20 06:21:54.44481 | 9937090 | 0 | 9899271 | 100 | 12500
511603 | 617941 | 1074259415 | 2022-01-20 06:21:45.71744 | 8065081 | 0 | 7582500 | 100 | 8889
511595 | 617935 | 1074128320 | 2022-01-20 06:21:44.030876 | 1051270 | 0 | 1014879 | 1 | 72
511584 | 617931 | 1074030019 | 2022-01-20 06:21:42.764088 | 609033 | 0 | 485887 | 100 | 8438
다음 쿼리는 일별 선택 쿼리 수와 평균 쿼리 경과 시간을 보여줍니다.
SELECT date_trunc('day',start_time) AS exec_day,
status,
COUNT(*) AS query_cnt,
AVG(datediff (microsecond,start_time,end_time)) AS elapsed_avg
FROM sys_query_history
WHERE query_type = 'SELECT'
AND start_time >= '2022-01-14'
AND start_time <= '2022-01-18'
GROUP BY exec_day,
status
ORDER BY exec_day,
status;
샘플 출력은 다음과 같습니다.
exec_day | status | query_cnt | elapsed_avg
---------------------+---------+-----------+------------
2022-01-14 00:00:00 | success | 5253 | 56608048
2022-01-15 00:00:00 | success | 7004 | 56995017
2022-01-16 00:00:00 | success | 5253 | 57016363
2022-01-17 00:00:00 | success | 5309 | 55236784
2022-01-18 00:00:00 | success | 8092 | 54355124
다음 쿼리는 일별 쿼리 경과 시간 성능을 보여줍니다.
SELECT distinct date_trunc('day',start_time) AS exec_day,
query_count.cnt AS query_count,
Percentile_cont(0.5) within group(ORDER BY elapsed_time) OVER (PARTITION BY exec_day) AS P50_runtime,
Percentile_cont(0.8) within group(ORDER BY elapsed_time) OVER (PARTITION BY exec_day) AS P80_runtime,
Percentile_cont(0.9) within group(ORDER BY elapsed_time) OVER (PARTITION BY exec_day) AS P90_runtime,
Percentile_cont(0.99) within group(ORDER BY elapsed_time) OVER (PARTITION BY exec_day) AS P99_runtime,
Percentile_cont(1.0) within group(ORDER BY elapsed_time) OVER (PARTITION BY exec_day) AS max_runtime
FROM sys_query_history
LEFT JOIN (SELECT date_trunc('day',start_time) AS day, count(*) cnt
FROM sys_query_history
WHERE query_type = 'SELECT'
GROUP by 1) query_count
ON date_trunc('day',start_time) = query_count.day
WHERE query_type = 'SELECT'
ORDER BY exec_day;
샘플 출력은 다음과 같습니다.
exec_day | query_count | p50_runtime | p80_runtime | p90_runtime | p99_runtime | max_runtime
---------------------+-------------+-------------+-------------+-------------+--------------+--------------
2022-01-14 00:00:00 | 5253 | 16816922.0 | 69525096.0 | 158524917.8 | 486322477.52 | 1582078873.0
2022-01-15 00:00:00 | 7004 | 15896130.5 | 71058707.0 | 164314568.9 | 500331542.07 | 1696344792.0
2022-01-16 00:00:00 | 5253 | 15750451.0 | 72037082.2 | 159513733.4 | 480372059.24 | 1594793766.0
2022-01-17 00:00:00 | 5309 | 15394513.0 | 68881393.2 | 160254700.0 | 493372245.84 | 1521758640.0
2022-01-18 00:00:00 | 8092 | 15575286.5 | 68485955.4 | 154559572.5 | 463552685.39 | 1542783444.0
2022-01-19 00:00:00 | 5860 | 16648747.0 | 72470482.6 | 166485138.2 | 492038228.67 | 1693483241.0
2022-01-20 00:00:00 | 1751 | 15422072.0 | 69686381.0 | 162315385.0 | 497066615.00 | 1439319739.0
2022-02-09 00:00:00 | 13 | 6382812.0 | 17616161.6 | 21197988.4 | 23021343.84 | 23168439.0
다음 쿼리는 쿼리 유형 분포를 보여줍니다.
SELECT query_type,
COUNT(*) AS query_count
FROM sys_query_history
GROUP BY query_type
ORDER BY query_count DESC;
샘플 출력은 다음과 같습니다.
query_type | query_count
------------+-------------
UTILITY | 134486
SELECT | 38537
DDL | 4832
OTHER | 768
LOAD | 768
CTAS | 748
COMMAND | 92
다음 예제에서는 여러 쿼리 간의 쿼리 해시 결과의 차이를 보여 줍니다. 다음 쿼리를 관찰합니다.
CREATE TABLE test_table (col1 INT);
INSERT INTO test_table VALUES (1),(2);
SELECT * FROM test_table;
SELECT * FROM test_table;
SELECT col1 FROM test_table;
SELECT * FROM test_table WHERE col1=1;
SELECT * FROM test_table WHERE col1=2;
SELECT query_id, TRIM(user_query_hash) AS user_query_hash, TRIM(generic_query_hash) AS generic_query_hash, TRIM(query_text) AS text FROM sys_query_history ORDER BY start_time
DESC LIMIT 10;
다음은 출력 샘플입니다.
query_id | user_query_hash | generic_query_hash | text
---------+-----------------+--------------------+----------
24723049 | oPuFtjEPLTs= | oPuFtjEPLTs= | select query_id, trim(user_query_hash) as user_query_hash, trim(generic_query_hash) as generic_query_hash, query_hash_version, trim(query_text) as text from sys_query_history order by start_time\r\ndesc limit 20
24723045 | Gw2Kwdd8m2I= | IwfRu8/XAKI= | select * from test_table where col1=2 limit 100
24723041 | LNw2vx0GDXo= | IwfRu8/XAKI= | select * from test_table where col1=1 limit 100
24723036 | H+qep/c82Y8= | H+qep/c82Y8= | select col1 from test_table limit 100
24723033 | H+qep/c82Y8= | H+qep/c82Y8= | select * from test_table limit 100
24723029 | H+qep/c82Y8= | H+qep/c82Y8= | select * from test_table limit 100
24723023 | 50sirx9E1hU= | uO36Z1a/QYs= | insert into test_table values (1),(2)
24723021 | YSVnlivZHeo= | YSVnlivZHeo= | create table test_table (col1 int)
SELECT * FROM test_table;
및 SELECT col1 FROM test_table;
에는 열이 하나뿐이므로 동일한 user_query_hash 값이 포함됩니다. SELECT * FROM test_table WHERE col1=1;
및 SELECT * FROM test_table WHERE col1=2;
에는 user_query_hash 값이 다르지만 두 쿼리가 쿼리 리터럴 1과 2 외부에서 동일하므로 generic_query_hash 값은 동일합니다.