49 lines
3.3 KiB
Markdown
49 lines
3.3 KiB
Markdown
---
|
||
aliases:
|
||
tags:
|
||
- зрелость/🌱
|
||
date:
|
||
- - 2024-06-10
|
||
zero-link:
|
||
- "[[00 PostgreSQL]]"
|
||
parents:
|
||
- "[[Профилирование запросов в PostgreSQL]]"
|
||
linked:
|
||
- "[[Explain в MySQL]]"
|
||
---
|
||
Используя ключевое слово `EXPLAIN` перед запросом, можно получить детальную информацию о том, что **планирует** сделать 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 не выполняет запрос, поэтому результаты будут лишь приблизительными. Можно улучшить качество анализа, если добавить ключевое слово `explain analyze`, тогда explain также выполнит запрос.
|
||
|
||
PostgreSQL использует условные единицы обозначающие стоимость выполнения запроса - cost. Один cost это время, которое затрачивается на извлечение 1 блока размером 8 килобайт при Seq Scan. При этом обычно используется 2 значения. Первое означает сколько времени пройдет до начала первых результатов, а вторая когда вернется весь результат.
|
||
|
||
Если cost очень маленький, а actual time большое, это может означать, что есть проблемы со сбором статистики. Возможно выключен автовакуум?
|
||
|
||
Стоит найти самый дорогой узел запроса и оптимизировать его.
|
||
|
||
**Виды проходов по индексу:**
|
||
- Seq Scan - последовательный просмотр таблицы. Худший вариант.
|
||
- Index Scan - просмотр по индексу в таблице
|
||
- Index Only Scan - был использован [Покрывающий индекс](Покрывающий%20индекс.md)
|
||
- Bitmap Heap Scan - оптимизация с построением битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем эти битовые карты комбинируются.
|
||
- Foreign Scan - сканирование на удаленном сервере. Используется при [Шардирование в PostgreSQL](Шардирование%20в%20PostgreSQL.md)
|
||
|
||
## Дополнительные материалы
|
||
- [Производительность запросов в PostgreSQL / Илья Космодемьянский (PostgreSQL Consulting) - YouTube](https://www.youtube.com/watch?v=c-ySk8COI1c) |