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

#### План запроса

описание того, каким образом СУБД будет выполнять 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);
- устранение лишних сортировок.