digital-garden/_inbox/Explain в PostgreSQL.md

49 lines
3.3 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:
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)