쿼리 실행 최적화

ClickHouse Inc에서는 다양한 최적화 전략을 소개했습니다.

ClickHouse는 주요 인덱스의 구조에 매우 의존합니다. 그러나 경우에 따라 쿼리가 주요 인덱스의 일부인 열에 의존하지만 첫 번째 열이 아닐 수 있습니다. 다중 주요 인덱스 사용은 이러한 경우 여러 옵션을 제공합니다. 예를 들어, 2차 인덱스로 데이터 스킵 인덱스를 사용하는 것 등이 있습니다.

복합 주요 인덱스의 경우 주요 열의 데이터 특성을 이해하는 것이 도움이 됩니다. 주요 열의 효율적인 정렬은 이러한 개념에 대한 자세한 내용을 다룹니다.

ClickHouse 블로그에는 거의 모든 위의 접근 방식을 개요로 설명한 ClickHouse 쿼리의 슈퍼 초방도 있습니다.

쿼리 파이프라인의 시각적인 단계를 얻기 위해 쿼리와 함께 EXPLAIN 문을 사용할 수 있습니다. EXPLAIN의 다른 유형에 유의하세요.

또한, 자세한 쿼리 실행 파이프라인을 얻기 위해 clickhouse-client를 통해 로그 레벨을 trace로 전환한 후 쿼리를 실행할 수 있습니다.

예를 들어:

```plaintext $ clickhouse-client :) SET send_logs_level = ‘trace’ $ clickhouse-client :) select count(traceID) from jaeger_index WHERE tenant = ‘12’ AND service != ‘jaeger-query’ FORMAT Vertical ;

SELECT count(traceID) FROM jaeger_index WHERE (tenant = ‘12’) AND (service != ‘jaeger-query’) FORMAT Vertical

Query id: 6ce40daf-e1b1-4714-ab02-268246f3c5c9

[cluster-0-0-0] 2023.01.30 06:31:32.240819 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} executeQuery: (from 127.0.0.1:53654) select count(traceID) from jaeger_index WHERE tenant = '12' AND service != 'jaeger-query' FORMAT Vertical ; (stage: Complete) .... [cluster-0-0-0] 2023.01.30 06:31:32.244071 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} InterpreterSelectQuery: MergeTreeWhereOptimizer: 조건 "service != 'jaeger-query'"이 PREWHERE로 이동되었습니다 [cluster-0-0-0] 2023.01.30 06:31:32.244420 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} InterpreterSelectQuery: MergeTreeWhereOptimizer: 조건 "service != 'jaeger-query'"이 PREWHERE로 이동되었습니다 .... [cluster-0-0-0] 2023.01.30 06:31:32.245153 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} InterpreterSelectQuery: FetchColumns -> Complete [cluster-0-0-0] 2023.01.30 06:31:32.245255 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} InterpreterSelectQuery: Complete -> Complete [cluster-0-0-0] 2023.01.30 06:31:32.245590 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} tracing_gcs.jaeger_index_local (66c6ca81-e20d-44dc-8101-92678fc24d99) (SelectExecutor): Key condition: (column 1 not in ['jaeger-query', 'jaeger-query']), unknown, (column 0 in ['12', '12']), and, and [cluster-0-0-0] 2023.01.30 06:31:32.245784 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} tracing_gcs.jaeger_index_local (66c6ca81-e20d-44dc-8101-92678fc24d99) (SelectExecutor): MinMax index condition: unknown, unknown, and, unknown, and [cluster-0-0-0] 2023.01.30 06:31:32.246239 [ 1503 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} tracing_gcs.jaeger_index_local (66c6ca81-e20d-44dc-8101-92678fc24d99) (SelectExecutor): Used generic exclusion search over index for part 202301_1512_21497_9164 with 4 steps [cluster-0-0-0] 2023.01.30 06:31:32.246293 [ 1503 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} tracing_gcs.jaeger_index_local (66c6ca81-e20d-44dc-8101-92678fc24d99) (SelectExecutor): Used generic exclusion search over index for part 202301_21498_24220_677 with 1 steps [cluster-0-0-0] 2023.01.30 06:31:32.246488 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} tracing_gcs.jaeger_index_local (66c6ca81-e20d-44dc-8101-92678fc24d99) (SelectExecutor): Selected 2/2 parts by partition key, 1 parts by primary key, 2/4 marks by primary key, 2 marks to read from 1 ranges [cluster-0-0-0] 2023.01.30 06:31:32.246591 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} MergeTreeInOrderSelectProcessor: 202301_1512_21497_9164부터 1개 범위에서 순서대로 1개 범위에서 16384개 행을 읽는 중 [cluster-0-0-0] 2023.01.30 06:31:32.642095 [ 348 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} AggregatingTransform: 집계 중 [cluster-0-0-0] 2023.01.30 06:31:32.642193 [ 348 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} Aggregator: 캐시에서 key=16426982211452591884에 대한 항목을 찾음: sum_of_sizes=2, median_size=1 [cluster-0-0-0] 2023.01.30 06:31:32.642210 [ 348 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} Aggregator: 집계 방법: without_key [cluster-0-0-0] 2023.01.30 06:31:32.642330 [ 348 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} AggregatingTransform: 집계됨. 0.395452983 초(8119.802 행/초, 126.89 KiB/초)에서 3211개에서 1개 행(50.18 KiB)으로. [cluster-0-0-0] 2023.01.30 06:31:32.642343 [ 348 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} Aggregator: 집계된 데이터 병합 행 1: ────── count(traceID): 3211 [cluster-0-0-0] 2023.01.30 06:31:32.642887 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} executeQuery: 16384개 행, 620.52 KiB를 0.401978272 초, 40758개 행/초, 1.51 MiB/초로 읽음. [cluster-0-0-0] 2023.01.30 06:31:32.645232 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} MemoryTracker: 최대 메모리 사용량(쿼리용): 831.98 KiB. [cluster-0-0-0] 2023.01.30 06:31:32.645251 [ 4991 ] {6ce40daf-e1b1-4714-ab02-268246f3c5c9} TCPHandler: 0.404908496 초에서 처리됨.

1개 행이 설정됨. 소요 시간: 0.402초. 16.38천 개 행, 635.41 KB 처리됨(40.71 천 개 행/초, 1.58 MB/초).