Итоги модуля: Настройка производительности
Модуль 12 охватил полный цикл диагностики и настройки производительности ClickHouse — от анализа плана запроса и profiling через system.trace_log до управления ресурсами на уровне workload. Девять уроков провели нас от инструментов профилирования к тонкой настройке и governance.
Ключевые решения проектирования
-
EXPLAIN-варианты для анализа запросов (PERF-01).
EXPLAIN PLAN(логический план),EXPLAIN PIPELINE(физический граф процессоров с параллелизмом),EXPLAIN ESTIMATE(оценка строк и гранул без выполнения),EXPLAIN SYNTAX(нормализация). New Analyzer (default 24.3+) переписывает AST до построения плана. Для performance tuning начинайте сEXPLAIN ESTIMATE, затемEXPLAIN PIPELINEдля анализа параллелизма. -
system.query_log как первый инструмент профилирования (PERF-02).
memory_usage,read_rows,query_duration_ms,ProfileEvents['UserTimeMicroseconds'],normalizedQueryHash()— весь baseline доступен без внешних инструментов. Всегда фильтруйтеWHERE type = 'QueryFinish': без этого фильтра query_log содержит QueryStart и Exception-записи, COUNT(*) завышается в 2-4 раза. -
Flamegraphs через system.trace_log + flameGraph() (PERF-03). Встроенный sampling profiler фиксирует callstack в system.trace_log.
flameGraph(trace, type)агрегирует стеки в SVG.SET jemalloc_enable_profiler=1включает per-query memory profiling. Для детального анализа — внешний инструмент clickhouse-flamegraph CLI. -
Query result cache для детерминированных агрегаций (PERF-04).
SETTINGS use_query_cache=1кэширует результат SELECT. Кэш не работает для non-deterministic функций (now(),rand()).system.query_cacheпоказывает содержимое,system.events WHERE event LIKE 'QueryCache%'— статистику hits/misses. -
Управление памятью: max_memory_usage и external aggregation (PERF-05).
max_memory_usageзадаёт per-query RAM-лимит.max_bytes_before_external_group_byвключает spill-to-disk для GROUP BY при нехватке памяти. Требование:max_bytes_before_external_group_byдолжен быть не более половиныmax_memory_usage.system.asynchronous_metrics WHERE metric LIKE '%Mem%'— мониторинг. -
Три слоя кэша: mark, uncompressed, compiled expression (PERF-06). Mark cache (default 5 ГБ) кэширует метки гранул (.mrk2 файлы) — критичен для повторных запросов с фильтрами по первичному ключу. Uncompressed cache кэширует разжатые блоки данных — эффективен только при повторном доступе к тем же гранулам. Compiled expression cache хранит JIT-скомпилированные выражения.
-
Ключевые настройки параллелизма и join (PERF-07).
max_threads(default = число CPU) — параллелизм чтения;EXPLAIN PIPELINEпоказывает фактическое число потоков.join_algorithm(hash/parallel_hash/grace_hash/full_sort_merge) — выбор алгоритма JOIN зависит от размера таблиц.optimize_move_to_prewhere=1(default) автоматически продвигает условия в PREWHERE для снижения IO. -
Query governance: лимиты и квоты (PERF-08).
max_rows_to_readиmax_execution_time— per-query защита от неконтролируемых запросов. Role-levelSETTINGSфиксируют лимиты для группы пользователей.CREATE QUOTA FOR INTERVALограничивает суммарное потребление за период. Комбинируйте: per-query для ad-hoc защиты, роли для системного управления, квоты для fair-use политики. -
Workload scheduling: fair resource allocation (PERF-09).
CREATE RESOURCEобъявляет IO или CPU ресурс.CREATE WORKLOADобразует иерархию групп сpriorityиweight.SET workload = 'name'маркирует запрос в группу. XML-конфиг workload deprecated — не виден черезSHOW WORKLOADSи требует перезапуска сервера.
Что дальше
Модуль 13: Продвинутые аналитические функции — после освоения инструментов профилирования и оптимизации следующий шаг — продвинутые агрегатные функции для product analytics и работы с временными рядами: windowFunnel(), sequenceMatch(), retention(), topK(), groupArray(), а также HNSW vector similarity (GA с 25.8) и экспериментальный TimeSeries engine.
Диагностический workflow для production-проблем: (1) Найдите тяжёлый запрос через system.query_log ORDER BY memory_usage DESC; (2) Изучите план через EXPLAIN PIPELINE и оцените параллелизм; (3) Проверьте flamegraph через system.trace_log + flameGraph() для CPU hotspot; (4) При необходимости примените governance: max_execution_time на уровне роли, workload scheduling для изоляции ETL от интерактивных запросов.