digital-garden/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md

60 lines
5.8 KiB
Markdown
Raw Normal View History

---
aliases:
tags:
- maturity/🌱
date: 2024-06-17
---
- [[../Оптимизация SQL запросов|Оптимизация SQL запросов]]
**Алгоритм оптимизации запросов:**
- **Проверка настроек**
- **Оборудование сервера БД**: убедитесь, что сервер имеет достаточную вычислительную мощность и оперативную память для обработки текущей нагрузки. Слабое оборудование может существенно снизить производительность.
- **Проблемы с сетью**: задержка в сети или потеря пакетов могут замедлять передачу данных между клиентом и сервером. Убедитесь в стабильности соединения.
- **Настройки базы данных**:
- Если у вас много соединений, используйте [[PgBouncer]], чтобы разгрузить управление соединениями.
- Проверьте, что `autovacuum` включен и настроен, чтобы избежать накопления "мусорных" строк, которые могут замедлить работу БД.
- Анализ и выбор [[../Плохой SQL запрос|проблемных запросов]]
- Оптимизировать все запросы подряд неэффективно. Начните с самых проблемных, чтобы добиться наибольшего улучшения.
- **Анализ проводите только на продуктовой БД**, так как тестовые среды могут не отражать реальную нагрузку.
- **Инструменты для анализа**:
- [pg_utils](pg_utils.md): утилиты для анализа производительности PostgreSQL.
- [[pg_stat_statements]]: расширение для сбора статистики выполнения запросов, помогает находить медленные запросы.
- [[Таблица статистик pg_stats|pg_stats]]: помогает определить, какие индексы стоит добавить или изменить.
- [[pageinspect]]: дает доступ к структуре страниц таблиц и индексов для глубокого анализа.
- **Оптимизация запросов**. Используйте [[Профилирование запросов в PostgreSQL|профилирование запросов в PostgreSQL]] для определения узких мест и точек, требующих оптимизации.
- **Изучение результатов оптимизации**. Проверьте улучшение производительности с помощью инструментов анализа, чтобы убедиться, что изменения действительно дают эффект.
- **Повторение анализа**. Оптимизация — это итеративный процесс. После улучшения одного запроса снова проанализируйте производительность системы и ищите новые узкие места.
**Конфигурационные параметры PostgreSQL**
- `work_mem`: увеличьте значение, если запросы требуют больших сортировок или операций с временными таблицами.
- `shared_buffers`: настройка этого параметра позволяет эффективно кэшировать данные в памяти и снижать количество обращений к диску.
- `maintenance_work_mem`: используйте для настройки памяти, выделяемой для операций обслуживания, таких как `VACUUM` и создание индексов.
![Почему JOIN работает медленно?](JOIN%20SQL.md#Почему%20JOIN%20работает%20медленно?)
![Проблемы производительности IN](IN%20SQL.md#Проблемы%20производительности%20IN)
PostgreSQL хранит статистику по выполнениям запросов в таблице `pg_stat_user_tables`. С её помощью можно оценить какие операции PostgreSQL выполняет чаще всего.
```sql
select relname, seq_scan, idx_scan, vacuum_count from pg_stat_user_tables
```
***
## Мета информация
**Область**:: [[../../../meta/zero/00 PostgreSQL|00 PostgreSQL]]
**Родитель**:: [[../Оптимизация SQL запросов|Оптимизация SQL запросов]]
**Источник**::
**Автор**::
**Создана**:: [[2024-06-17]]
### Дополнительные материалы
- [Производительность запросов в PostgreSQL / Илья Космодемьянский (PostgreSQL Consulting) - YouTube](https://www.youtube.com/watch?v=c-ySk8COI1c)
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
- [[Таблица статистик pg_stats]]
- [[Частичный индекс]]
- [[pageinspect]]
- [[Профилирование запросов в PostgreSQL]]
- [[pg_stat_statements]]
<!-- SerializedQuery END -->