digital-garden/dev/database/postgresql/Профилирование запросов в PostgreSQL.md
2024-10-25 20:04:39 +03:00

55 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- explain
tags:
- maturity/🌱
date: 2024-06-10
---
Ключевое слово `EXPLAIN` перед SQL-запросом позволяет получить детальную информацию о том, как PostgreSQL **планирует** выполнить этот запрос "под капотом". Это полезно для диагностики производительности, поскольку помогает понять, какие шаги выполняет база данных и где могут быть узкие места.
Пример использования `EXPLAIN`
```sql
postgres=# EXPLAIN SELECT * FROM users WHERE id = 20;
QUERY PLAN
-------------------------------------------------------
Index Scan using users_pkey on users (cost=0.15..8.17 rows=1 width=72)
Index Cond: (id = 20)
(2 rows)
```
Вывод информации можно изменить. Например, чтобы получить результат в формате JSON:
```sql
EXPLAIN (FORMAT JSON) SELECT * FROM users WHERE id = 20;
```
> [!NOTE] Analyze
> `EXPLAIN` не выполняет сам запрос, поэтому результаты будут приблизительными. Для более точного анализа можно добавить ключевое слово `ANALYZE`, и тогда `EXPLAIN` также выполнит запрос.
## Стоимость выполнения запроса (cost)
PostgreSQL использует условные единицы для обозначения стоимости выполнения запроса — `cost`. Один `cost` примерно соответствует времени, затраченному на извлечение одного блока данных размером 8 килобайт при последовательном сканировании (Seq Scan).
Часто используются два значения `cost`:
- **Первое значение**: стоимость до начала получения первых результатов.
- **Второе значение**: полная стоимость выполнения запроса.
Если оценочное значение `rows` слишком низкое по сравнению с фактическим количеством строк, это может означать, что статистика таблицы устарела. В таком случае необходимо выполнить `ANALYZE` для обновления статистики и улучшения качества планирования запросов.
## Виды проходов по таблице и индексу
- **Seq Scan**: последовательный просмотр всей таблицы. Это наиболее медленный вариант и обычно нежелателен. Решение — добавить [[../Индекс в БД|индекс]], чтобы ускорить выборку данных.
- **Index Scan**: использование [[../Индекс в БД|индекса]] для просмотра таблицы.
- **Index Only Scan**: использование [[../Покрывающий индекс|покрывающего индекса]], когда все нужные данные находятся в индексе и не требуется дополнительного доступа к таблице.
- **Bitmap Heap Scan**: оптимизация с использованием битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем они комбинируются.
- **Foreign Scan**: сканирование данных на удаленном сервере, используемое при [[Шардирование в PostgreSQL|шардировании]].
***
## Мета информация
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
**Родитель**:: [[Оптимизация SQL запросов в PostgreSQL]]
**Источник**::
**Автор**::
**Создана**:: [[2024-01-29]]
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->