Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Обработка запросов (Query Processing)

Goal

Объяснить как AngaraBase обрабатывает SQL-запросы: от текста до результата. Полезно для понимания EXPLAIN-планов и диагностики производительности.

Pipeline overview

Каждый SQL-запрос проходит четыре стадии:

SQL text ──▸ Parsing ──▸ Planning ──▸ Optimization ──▸ Execution ──▸ Result

1. Parsing: SQL → AST

Парсер преобразует текст запроса в абстрактное синтаксическое дерево (AST). AngaraBase использует PostgreSQL-совместимый SQL-диалект.

Если синтаксис не поддерживается, сервер возвращает SQLSTATE 0A000 (feature_not_supported) с описанием неподдерживаемой конструкции.

2. Planning: AST → logical plan

На этапе планирования выполняется:

  • Name resolution — сопоставление имён таблиц, колонок и функций с объектами каталога.
  • Type checking — проверка типов и автоматическое приведение (coercion) при необходимости.

Результат — логический план, описывающий что нужно сделать, но не как.

3. Optimization (AngaraPlan)

Оптимизатор AngaraPlan преобразует логический план в физический, выбирая наиболее эффективную стратегию выполнения.

Cost-based optimizer (CBO): решения принимаются на основе статистики (AngaraStat) — количество строк, распределение значений, наличие индексов.

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

РешениеВарианты
Access pathFull table scan, B+tree index scan, BRIN scan
Join methodHash join, nested loop join
Join orderПерестановка таблиц для минимизации промежуточных результатов

Robust planning: оптимизатор устойчив к ошибкам в оценках — при значительном расхождении между estimated и actual rows план остаётся работоспособным (не приводит к worst-case поведению).

LEO (Learning Optimizer): feedback loop — после выполнения запроса фактическая статистика используется для улучшения будущих оценок.

4. Execution (AngaraFlow)

Исполнитель AngaraFlow выполняет физический план в iterator/streaming модели (Volcano): каждый оператор запрашивает следующую строку у дочернего оператора.

Основные операторы:

ОператорОписание
ScanЧтение строк из heap (full scan) или индекса (index scan)
FilterПрименение предикатов WHERE
Hash JoinСоединение через hash-таблицу; Grace hash join для больших datasets
Nested LoopСоединение вложенными циклами (для малых таблиц или index lookup)
Group ByАгрегация (GROUP BY, HAVING)
SortСортировка; external sort для данных, не помещающихся в память
LimitОграничение количества строк

AngaraStat (статистика)

Оптимизатор использует статистику из системных таблиц для оценки стоимости планов.

sys.table_stats

КолонкаОписание
row_countОценочное количество строк в таблице
mutation_epochСчётчик мутаций (для определения устаревшей статистики)

sys.column_stats

КолонкаОписание
ndvNumber of distinct values (HyperLogLog)
min_value / max_valueГраницы диапазона значений
null_countКоличество NULL-значений
histogramРаспределение значений (equi-height histogram)
mcvMost common values (частые значения и их доли)

Управление уровнем статистики

ALTER TABLE t SET (stats_level_max = 2);
LevelЧто собирается
0Только row_count и mutation_epoch
1+ NDV, min/max, null_count
2+ Histograms, MCV (reservoir sampling)
3+ Extended statistics (зарезервировано)

Более высокий уровень даёт оптимизатору больше информации, но увеличивает время сбора статистики.

Диагностика запросов

EXPLAIN

Просмотр плана выполнения без выполнения запроса:

EXPLAIN SELECT * FROM orders WHERE customer_id = 42;

Варианты:

EXPLAIN ANALYZE SELECT ...; -- выполняет запрос, показывает actual rows/time
EXPLAIN (BUFFERS) SELECT ...; -- + статистика чтения страниц
EXPLAIN (FORMAT JSON) SELECT ...; -- вывод в JSON

Системные представления

ПредставлениеОписание
angara_stat_activityТекущие активные запросы
angara_stat_statementsАгрегированная статистика по типам запросов
angara_top_queriesТоп-запросы по времени выполнения

Slow query log

Включается через переменную окружения:

ANGARABASE_LOG_MIN_DURATION_MS=100 # логировать запросы дольше 100 мс
ANGARABASE_LOG_QUERY_TEXT=1 # включить текст запроса в лог

Подробнее — Диагностика.

Future

Запланированные улучшения обработки запросов:

КомпонентОписание
AngaraVectorVectorized/SIMD execution — обработка batch по колонкам вместо row-at-a-time
AngaraParallelMorsel-driven parallelism — параллельное выполнение на нескольких ядрах
AngaraAdaptAdaptive processing — переключение стратегий во время выполнения

Связанные разделы

Концепции (что почитать дальше)

How-to (что сделать)

  • ДиагностикаEXPLAIN ANALYZE, slow-query log, как читать план.
  • Tracing — распределённая трассировка фаз parse → plan → execute.
  • ЛогированиеANGARABASE_LOG_QUERY_TEXT, ANGARABASE_LOG_MIN_DURATION_MS.

Справочник