

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# SYS\_QUERY\_HISTORY
<a name="SYS_QUERY_HISTORY"></a>

SYS\_QUERY\_HISTORY를 사용하여 사용자 쿼리의 세부 정보를 봅니다. 각 행은 일부 필드에 대한 누적 통계가 있는 사용자 쿼리를 나타냅니다. 이 보기에는 데이터 정의 언어(DDL), 데이터 조작 언어(DML), 복사, 언로드 및 Amazon Redshift Spectrum과 같은 다양한 유형의 쿼리가 포함되어 있습니다. 여기에는 실행 중인 쿼리와 완료된 쿼리가 모두 포함됩니다.

SYS\_QUERY\_HISTORY는 모든 사용자에게 표시됩니다. 수퍼유저는 모든 행을 볼 수 있지만 일반 사용자는 자체 데이터만 볼 수 있습니다. 자세한 내용은 [시스템 테이블 및 뷰에 있는 데이터의 가시성](cm_chap_system-tables.md#c_visibility-of-data) 섹션을 참조하세요.

**참고**  
실행된 쿼리가 포함된 트랜잭션이 성공적으로 커밋되었는지 확인하려면 시스템 테이블과 `sys_transaction_history` 테이블 간에 조인 작업을 수행해야 합니다. 예제:  

```
SELECT 
    qh.transaction_id,
    qh.query_id,
    qh.status AS query_status,
    qh.query_type,
    TRIM(qh.query_text) AS query_text,
    th.status AS transaction_status
FROM 
    sys_query_history qh
LEFT JOIN 
    sys_transaction_history th ON qh.transaction_id = th.transaction_id;
```

## 테이블 열
<a name="SYS_QUERY_HISTORY-table-columns"></a>


| 열 이름  | 데이터 유형  | 설명  | 
| --- | --- | --- | 
| 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 | timestamp | 쿼리가 시작된 시간입니다. | 
| end\_time | timestamp | 쿼리가 완료된 시간입니다. | 
| 경과 시간 | 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](cm-c-wlm-system-tables-and-views.md#wlm-service-class-ids) 섹션으로 이동하세요.<br />이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Redshift Serverless에서 실행되는 쿼리의 경우, 이 열에는 -1이 포함됩니다. | 
| service\_class\_name | character(64) | 서비스 클래스 이름입니다.<br />이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Amazon Redshift Redshift Serverless에서 실행되는 쿼리의 경우. 이 열이 비어 있습니다. | 
| query\_priority | character(20) | 쿼리가 실행된 대기열의 우선순위. 가능한 값은 다음과 같습니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/SYS_QUERY_HISTORY.html)<br />NULL은 해당 쿼리에 쿼리 우선순위가 지원되지 않음을 의미합니다.<br />이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. Redshift Serverless에서 실행되는 쿼리의 경우. 이 열이 비어 있습니다. | 
| short\_query\_accelerated | character(10) | 단기 쿼리 가속화(SQA)를 사용하여 쿼리를 가속했는지 여부. 가능한 값은 다음과 같습니다.[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/redshift/latest/dg/SYS_QUERY_HISTORY.html)<br />이 열은 프로비저닝된 클러스터에서 실행되는 쿼리에만 사용됩니다. 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입니다. 결과 캐싱을 사용하지 않은 경우 이 필드 값은 `0`입니다. | 
| 사용자 이름 | character(128) | 쿼리를 제출한 사용자의 사용자 이름입니다. | 

## 샘플 쿼리
<a name="SYS_QUERY_HISTORY-sample-queries"></a>

다음 쿼리는 실행 중인 쿼리와 대기 중인 쿼리를 반환합니다.

```
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 값은 동일합니다.