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설정.