system.session_query_ids 시스템 테이블

system.session_query_ids 시스템 테이블

system.session_query_ids 는 현재 세션에서 실행된 쿼리의 쿼리 ID를 실행 순서대로 담고 있어요. 클라이언트 측에서 query_id 를 할당하거나 log_comment 로 태그하지 않고도 system.query_log 에서 “방금 실행한 쿼리”를 찾는 데 사용할 수 있어요.

출처: 문서

본문

Description

현재 세션에서 실행된 쿼리의 쿼리 ID를 실행 순서대로 포함해요. system.query_log 에서 “방금 실행한 쿼리”를 찾는 데 사용하려면 클라이언트 측에서 query_id 를 할당하거나 log_comment 로 쿼리를 태그할 필요 없이 사용할 수 있어요. 내용은 세션 범위로 한정돼요. 각 세션은 자신의 기록만 볼 수 있고, 다른 세션의 쿼리는 절대 나타나지 않아요. 쿼리 ID는 쿼리가 시작할 때 기록되므로:

  • 현재 실행 중인 쿼리는 그 테이블에서 선택할 때 이미 보여요.

  • 실패한 쿼리도 기록돼요 — 방금 실패한 쿼리의 ID를 검색하는 것이 주요 사용 사례예요.

내부 쿼리(시스템 로그 flush 등)는 기록되지 않아요. 분산 쿼리가 원격 샤드에서 실행하는 하위 쿼리도 기록되지 않아요 — 시작 쿼리만 시작자의 세션에 나타나요.

인터페이스별 세션 범위

  • Native/TCP 연결 (clickhouse-client, 드라이버) 및 clickhouse-local : 세션은 연결이므로 기록은 다중 쿼리 클라이언트 호출을 포함해 연결의 모든 쿼리에 걸쳐 누적돼요.

  • session_id 파라미터가 있는 HTTP: 세션이 만료될 때까지 동일한 session_id 를 전달하는 요청들 사이에서 기록이 유지돼요.

  • session_id 가 없는 HTTP: 모든 요청이 각자의 세션이므로 테이블에는 항상 현재 쿼리만 표시돼요.

기록 크기

기록은 세션 설정 session_query_ids_history_size(기본값 1000)로 제한되는 링 버퍼예요. 기록이 이 크기를 초과하면 가장 오래된 항목부터 먼저 제거돼요. 0 으로 설정하면 기록을 비활성화하고, 앞서 기록된 항목은 truncate되거나 제거될 때까지 테이블에 남아요. 설정은 쿼리가 파싱되기 전인 쿼리 시작 시에 읽히므로 쿼리 자체의 SETTINGS 절은 그 쿼리가 기록되는지에 영향을 주지 않아요. 대신 SET, HTTP URL 파라미터, 또는 설정 프로필을 사용해 주세요.

TRUNCATE

TRUNCATE TABLE system.session_query_ids 는 현재 세션의 기록을 지워요. 시퀀스 카운터는 리셋되지 않으므로 세션 내에서 sequence_number 값이 재사용되는 일은 없어요.

Columns

  • sequence_number (UInt64) — 세션 내 쿼리의 위치예요. 단조 증가해요.

  • query_id (String) — 쿼리 ID예요. system.query_log 와 조인할 수 있어요.

Example

몇 개의 쿼리를 실행한 다음 system.query_log 에서 그 세부 정보를 가져와 볼게요:

SELECT 1 FORMAT Null;
SELECT 2 FORMAT Null;

SELECT * FROM system.session_query_ids;
┌─sequence_number─┬─query_id─────────────────────────────┐
│               1 │ 4c9e97a3-b806-4a5c-9a94-5a614c3d0b3f │
│               2 │ 8f9a2f59-30d3-4f8e-b3a1-6a0c1a4d3e2b │
│               3 │ f2b1c4d8-7e6a-4b5c-8d9e-0a1b2c3d4e5f │
└─────────────────┴──────────────────────────────────────┘

현재 쿼리는 시작 시 기록되므로 마지막 항목으로 나타나요. 타임스탬프, 상태 및 기타 모든 세부 정보는 system.query_log 와 조인하여 확인할 수 있어요:

SYSTEM FLUSH LOGS query_log;

SELECT query_id, type, query, query_duration_ms
FROM system.query_log
WHERE query_id IN (SELECT query_id FROM system.session_query_ids)
ORDER BY event_time_microseconds;

See also

  • system.query_log - 실행된 쿼리의 세부 정보.

  • session_query_ids_history_size 설정.