60 lines
5.8 KiB
Markdown
60 lines
5.8 KiB
Markdown
|
---
|
|||
|
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 -->
|