digital-garden/dev/database/postgresql/Оптимизация SQL запросов в PostgreSQL.md
2024-10-25 20:04:39 +03:00

60 lines
5.8 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:
- 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 -->