[Clickhouse] 쿼리 성능 분석

clickhouse에서 쿼리를 분석하고 최적화하는 방법을 간단히 다뤄본다.




EXPLAIN 구문

Clickhouse도 RDB들과 유사하게, 쿼리의 분석과 최적화를 위한 EXPLAIN 구문을 지원한다.
다만, RDB들과 다르게, EXPLAIN(ANALYZE)처럼 직접 실행까지 해서 분석하는건 EXPLAIN 구문으로 제공하지 않는다. 실행 전 분석만 해준다.

사용법은 간단하다. 앞에 EXPLAIN만 붙이면 된다.

EXPLAIN SELECT ...

그럼 이렇게 쿼리 실행 계획을 보여준다.
이 경우에는 그냥 그대로 SELECT만 하는 거라서 별다른 부분이 없다.

필터나 정렬 등을 추가한다면

이런 식으로 트리가 보일 것이다.
정렬을 하고, Limit을 걸어서 잘라오는 것 까지가 시가고하된 채로 보인다.




실제 실행 로그 보기

실제로 실행한 상태에서의 소요 시간이나 비용은, 그냥 SELECT 쿼리를 날릴 때 확인할 수 있다.
위의 쿼리를 EXPLAIN 없이 날리면 그냥 이렇게 보여준다.

소요시간, 사용한 메모리 등이 노출된다.

더 상세한 쿼리 실행 시점의 로그를 확인하고 싶다면 로그레벨을 설정한 뒤에 쿼리를 날리면 된다.

SET send_logs_level = 'debug';

그럼 이런 식으로 로그를 찍어준다.

진짜 세밀하게, 인덱스를 어떻게 쓰고 블록을 몇개나 스캔했는지까지 보고 싶다면
로그레벨을 trace로 조절할 수 있다.

SET send_logs_level = 'trace'

Secondary index, 스킵 인덱스의 스킵 현황을 알고 싶다면 이걸로 보는게 좋다.




쿼리 기록 조회

실행하고 난 뒤에 쿼리가 어떻게 실행되었고 리소스를 얼마나 먹었는지 상세하게 보고 싶다면, 다음과 같이 쿼리를 쏴볼 수 있다.

SELECT 
    query_id,
    query,
    read_rows,
    read_bytes,
    written_rows,
    written_bytes,
    memory_usage,
    thread_ids,
    ProfileEvents,
    length(thread_ids) as thread_count
FROM system.query_log
WHERE query_id = 'QueryID' AND type = 'QueryFinish'
ORDER BY event_time DESC
LIMIT 1



참조
https://clickhouse.com/docs/sql-reference/statements/explain
https://clickhouse.com/docs/guides/developer/understanding-query-execution-with-the-analyzer