Skip to main content

Оптимизация запросов. Планы запросов.

План запроса

описание того, каким образом СУБД будет выполнять SQL-запрос, включая порядок операций, способы доступа к данным и оценки затрат.

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

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

План запроса используется для:

  • выбора наиболее эффективного способа выполнения;
  • анализа медленных запросов;
  • поиска проблем с индексами;
  • оценки нагрузки на систему;
  • сравнения вариантов оптимизации.

Виды планов запросов

По уровню абстракции
Тип плана Описание
Логический Описывает что нужно сделать (SELECT, JOIN, WHERE)
Физический Описывает как именно выполняется запрос
По моменту получения
План Характеристика
Оценочный (Estimated) Строится до выполнения
Фактический (Actual) Получается после выполнения с замерами

Структура плана запроса

План обычно представлен в виде дерева операций, где:

  • листья — чтение данных;
  • узлы — обработка;
  • корень — итоговый результат.

Основные операции плана

Операции доступа к данным
Операция Назначение
Seq Scan Полное сканирование таблицы
Index Scan Чтение через индекс
Index Only Scan Только индекс, без таблицы
Bitmap Index Scan Поиск подходящих строк
Bitmap Heap Scan Чтение строк по битовой карте
Операции соединения таблиц (JOIN)
Тип JOIN Описание
Nested Loop Вложенные циклы
Hash Join Хэш-таблица в памяти
Merge Join Слияние отсортированных данных

Выбор зависит от:

  • размера таблиц;
  • наличия индексов;
  • условий соединения.
Операции обработки данных
Операция Функция
Filter Применение условий
Sort Сортировка
Aggregate Агрегация (SUM, COUNT)
GroupAggregate Группировка
HashAggregate Агрегация через хэш
Limit Ограничение строк
Materialize Временное хранение

Метрики плана запроса

Стоимость (Cost)
cost = startup_cost .. total_cost
Метрика Значение
Startup Cost Цена получения первой строки
Total Cost Общая оценка стоимости

Стоимость — условная величина, не время

Количество строк
Метрика Описание
rows (estimated) Ожидаемое число строк
rows (actual) Фактическое число строк

Большая разница → проблемы со статистикой

Время
Показатель Назначение
Planning Time Время построения плана
Execution Time Время выполнения
Использование ресурсов
Метрика Описание
CPU Загрузка процессора
I/O Дисковые операции
Memory Использование памяти
Loops Количество повторений

Оптимизация запросов по плану

Основные методы оптимизации:

  • добавление индексов;
  • уменьшение числа строк;
  • корректные JOIN;
  • отказ от SELECT *;
  • обновление статистики (ANALYZE);
  • устранение лишних сортировок.