37 lines
1.9 KiB
Markdown
37 lines
1.9 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date:
|
|||
|
- - 2024-06-10
|
|||
|
zero-link:
|
|||
|
- "[[00 PostgreSQL]]"
|
|||
|
parents:
|
|||
|
- "[[Профилирование запросов в PostgreSQL]]"
|
|||
|
linked:
|
|||
|
---
|
|||
|
Используя ключевое слово `EXPLAIN` перед запросом, можно получить детальную информацию о том, что делает PostgreSQL под капотом для выполнения запроса, и что это ему стоит.
|
|||
|
|
|||
|
Пример выполнения
|
|||
|
```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;
|
|||
|
```
|
|||
|
|
|||
|
Explain не выполняет запрос, поэтому результаты будут лишь приблизительными. Можно улучшить качество анализа, если добавить ключевое слово `explain analyze`, тогда explain также выполнит запрос.
|
|||
|
|
|||
|
**Виды проходов по индексу:**
|
|||
|
- Seq Scan - последовательный просмотр таблицы. Худший вариант.
|
|||
|
- Index Scan - просмотр по индексу в таблице
|
|||
|
- Index Only Scan - был использован [Покрывающий индекс](Покрывающий%20индекс.md)
|
|||
|
- Bitmap Heap Scan - оптимизация с построением битовых карт для поиска. Сначала строятся битовые карты с использованием нескольких индексов, затем эти битовые карты комбинируются.
|