TGViewer
BackendQuiz - задачи с собеседований по бэкенду BackendQuiz - задачи с собеседований по бэкенду @backendquiz · 1.71K subscribers
Post #2180 60
🤔 Каким образом можно найти "медленный запрос" и проанализировать его в PostgreSQL?

🚩Методы и инструменты.

🟠Включение журналирования медленных запросов
Настройка параметров конфигурации PostgreSQL для журналирования медленных запросов позволяет отслеживать запросы, выполнение которых занимает много времени.
1⃣Откройте файл конфигурации PostgreSQL (postgresql.conf).
2⃣Настройте следующие параметры:
# Включить логирование всех запросов
log_statement = 'all'

# Либо логирование только медленных запросов
log_min_duration_statement = 1000 # Логировать запросы, выполнение которых заняло более 1000 мс (1 секунда)

3⃣Перезапустите сервер PostgreSQL для применения изменений:
sudo systemctl restart postgresql

🟠Использование инструмента `pg_stat_statements`
Расширение pg_stat_statements позволяет собирать статистику по выполненным запросам и предоставляет информацию о частоте, времени выполнения и других характеристиках запросов.
1⃣Включите расширение в postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'

2⃣Перезапустите сервер PostgreSQL:
sudo systemctl restart postgresql

3⃣Создайте расширение в нужной базе данных:
CREATE EXTENSION pg_stat_statements;

4⃣Используйте запрос для получения информации о медленных запросах:
SELECT
query,
calls,
total_time,
mean_time,
stddev_time,
rows,
min_time,
max_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;

🟠Анализ запросов с помощью `EXPLAIN` и `EXPLAIN ANALYZE`
Команды EXPLAIN и EXPLAIN ANALYZE позволяют понять, как PostgreSQL планирует и выполняет запросы, предоставляя детальную информацию о плане выполнения.
1⃣Выполните команду EXPLAIN для запроса:
EXPLAIN SELECT * FROM my_table WHERE id = 1;

2⃣Выполните команду EXPLAIN ANALYZE для запроса:
EXPLAIN ANALYZE SELECT * FROM my_table WHERE id = 1;

3⃣Анализируйте выходные данные, чтобы понять, какие операции занимают больше всего времени (например, полное сканирование таблицы, узкие места при соединении таблиц и т.д.).

🟠Использование системных представлений и утилит
pg_stat_activity: Показывает текущую активность базы данных, включая выполняемые запросы и их состояние.
SELECT
pid,
usename,
state,
query,
now() - query_start AS duration
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;

pg_locks: Отображает информацию о текущих блокировках в базе данных.
SELECT * FROM pg_locks;

1⃣Индексы:
Убедитесь, что для часто используемых условий WHERE и JOIN существуют соответствующие индексы.
2⃣Переписывание запросов:
Попробуйте переписать запросы для улучшения их производительности.
3⃣Материализованные представления:
Используйте материализованные представления для часто выполняемых сложных запросов.
4⃣Конфигурация сервера:
Настройте параметры конфигурации PostgreSQL для оптимизации производительности (например, work_mem, shared_buffers, maintenance_work_mem).

Ставь 👍 и 📚

@backendquiz
  • 👍 2
More from @backendquiz
  1. Oct 2, 2026🤔 Какие join бывают? В реляционных базах данных, операции объединения (JOIN) позволяют об…
  2. Sep 28, 2026🤔 Что такое CGI? Это стандартный протокол для веб-серверов, который позволяет запускать в…
  3. Sep 27, 2026🤔 Примеры систем CP, AP и CA? В контексте CAP-теоремы(Consistency, Availability, Partitio…
  4. Sep 26, 2026🤔 Что такое инкапсуляция? Это один из основных принципов объектно-ориентированного програ…
  5. Sep 25, 2026🤔 Что такое Docker Compose? Это инструмент, который позволяет определить и управлять мног…
  6. Sep 24, 2026🤔 Чем отличаются LEFT JOIN от INNER JOIN? Это два типа соединений (joins) в языке SQL, ко…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →