Обработка запросов (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 path | Full table scan, B+tree index scan, BRIN scan |
| Join method | Hash 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
| Колонка | Описание |
|---|---|
ndv | Number of distinct values (HyperLogLog) |
min_value / max_value | Границы диапазона значений |
null_count | Количество NULL-значений |
histogram | Распределение значений (equi-height histogram) |
mcv | Most 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
Запланированные улучшения обработки запросов:
| Компонент | Описание |
|---|---|
| AngaraVector | Vectorized/SIMD execution — обработка batch по колонкам вместо row-at-a-time |
| AngaraParallel | Morsel-driven parallelism — параллельное выполнение на нескольких ядрах |
| AngaraAdapt | Adaptive processing — переключение стратегий во время выполнения |
Связанные разделы
Концепции (что почитать дальше)
- Индексы — как оптимизатор выбирает индекс для
SELECT/UPDATE. - Каталог и метаданные — где хранится статистика, которой пользуется планировщик.
- Транзакции и MVCC — как уровень изоляции влияет на план выполнения.
How-to (что сделать)
- Диагностика —
EXPLAIN ANALYZE, slow-query log, как читать план. - Tracing — распределённая трассировка фаз parse → plan → execute.
- Логирование —
ANGARABASE_LOG_QUERY_TEXT,ANGARABASE_LOG_MIN_DURATION_MS.
Справочник
- SQL Overview — что из стандарта поддерживается на уровне planner-а.
- Системные представления
sys.*—sys.queries,sys.column_stats,sys.health.