Learning Platform
Глоссарий Troubleshooting
Урок 13.10 · 15 мин
Продвинутый
summaryperformance tuningprofiling

Итоги модуля: Настройка производительности

Модуль 12 охватил полный цикл диагностики и настройки производительности ClickHouse — от анализа плана запроса и profiling через system.trace_log до управления ресурсами на уровне workload. Девять уроков провели нас от инструментов профилирования к тонкой настройке и governance.


Ключевые решения проектирования

  1. EXPLAIN-варианты для анализа запросов (PERF-01). EXPLAIN PLAN (логический план), EXPLAIN PIPELINE (физический граф процессоров с параллелизмом), EXPLAIN ESTIMATE (оценка строк и гранул без выполнения), EXPLAIN SYNTAX (нормализация). New Analyzer (default 24.3+) переписывает AST до построения плана. Для performance tuning начинайте с EXPLAIN ESTIMATE, затем EXPLAIN PIPELINE для анализа параллелизма.

  2. 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 раза.

  3. 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.

  4. 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.

  5. Управление памятью: 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%' — мониторинг.

  6. Три слоя кэша: mark, uncompressed, compiled expression (PERF-06). Mark cache (default 5 ГБ) кэширует метки гранул (.mrk2 файлы) — критичен для повторных запросов с фильтрами по первичному ключу. Uncompressed cache кэширует разжатые блоки данных — эффективен только при повторном доступе к тем же гранулам. Compiled expression cache хранит JIT-скомпилированные выражения.

  7. Ключевые настройки параллелизма и 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.

  8. Query governance: лимиты и квоты (PERF-08). max_rows_to_read и max_execution_time — per-query защита от неконтролируемых запросов. Role-level SETTINGS фиксируют лимиты для группы пользователей. CREATE QUOTA FOR INTERVAL ограничивает суммарное потребление за период. Комбинируйте: per-query для ad-hoc защиты, роли для системного управления, квоты для fair-use политики.

  9. 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.

TIP

Диагностический 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 от интерактивных запросов.

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 10