Администрируем
Oracle, SQL Server, PostgreSQL

Оптимизация производительности PostgreSQL

Как происходит анализ производительности PostgreSQL? PostgreSQL оптимизация производительности — подробнее про анализ баз данных на нашем сайте.

Особенности анализа производительности в PostgreSQL

В ситуациях, когда SQL-запросы выполняются слишком долго, необходим анализ производительности в PostgreSQL. Если сервер работает медленно, решение проблемы может быть далеко не очевидным, ведь на производительность базы влияет множество параметров.


Анализ производительности в PostgreSQL является важной частью обслуживания баз данных, и понимание основных аспектов этого процесса позволяет улучшить производительность и эффективность работы.

Анализ производительности в PostgreSQL

Рассмотрим ключевые аспекты анализа производительности в PostgreSQL:

Поиск медленных запросов

  • pg_stats_statements. Модуль отслеживает статистику выполнения операторов SQL и может быть простым способом поиска неэффективных запросов.
После установления этого модуля системное представление с именем pg_stat_statements будет доступно со всеми свойствами. При сборе достаточного объёма данных следует найти запросы, которые имеют относительно высокое значение total_time, и заняться ими в первую очередь.

  • auto_explain. Модуль для поиска медленных запросов, который обладает двумя явными преимуществами: регистрирует фактический план выполнения и поддерживает запись вложенных операторов с помощью опции log_nested_statements. Вложенные операторы — это те операторы, которые выполняются внутри функции.
Опция log_min_duration контролирует планы выполнения запросов с упором на их длительность выполнения.

Оптимизация индексов

Также важно настроить корректное использование индексов. В этом поможет Cборщик Cтатистики (Postgres Statistics Collector) — необходимая подсистема, которая собирает все виды полезной статистики производительности. Используем Сборщика для поиска отсутствующих и неиспользуемых индексов.
  • Отсутствующие индексы. Можете выполнить следующий запрос в Сборщике статистики:
SELECT
  relname, 
  seq_scan - idx_scan AS too_much_seq, 
  CASE 
    WHEN 
       seq_scan - coalesce(idx_scan, 0) > 0 
    THEN 
      'Missing Index?' 
    ELSE 
      'OK' 
  END, 
  pg_relation_size(relname::regclass) AS rel_size, seq_scan, idx_scan 
FROM 
  pg_stat_all_tables 
WHERE 
  schemaname = 'public' 
  AND pg_relation_size(relname::regclass) > 80000 
ORDER BY 
  too_much_seq DESC;
Хотя запрос не скажет напрямую, по каким столбцам создать индекс, он поможет найти таблицы, в которых было больше последовательных сканирований (Sequential Scans), чем индексных сканирований (Index Scans).
  • Неиспользуемые индексы. Неиспользуемые индексы могут негативно влиять на производительность записи, ведь правильное добавление индекса может ускорить чтение данных, но вместе с этим замедлить операции записи (INSERT / UPDATE / DELETE). Чтобы найти неиспользуемые индексы, выполните следующий запрос:
SELECT 
indexrelid::regclass as index, 
relid::regclass as table, 
'DROP INDEX ' || indexrelid::regclass || ';' as drop_statement
FROM 
pg_stat_user_indexes 
JOIN 
pg_index USING (indexrelid) 
WHERE 
  idx_scan = 0 
  AND indisunique is false;

Планы выполнения

Команда EXPLAIN. Незаменимый инструмент, который наглядно покажет план выполнения: нужно добавить к запросу EXPLAIN и запустить команду.

Примечание 1: Для локальной отладки вручную можно добавить параметры ANALYZE и BUFFERS, чтобы помимо основной отработки запроса получить время выполнения, статистическую информацию, количество попаданий и другие сведения.

Примечание 2: Для объёмных бд есть модуль auto_explain, в котором задаётся «медленное» время выполнения запроса. Так, оператор анализирует и записывает план в лог сервера только в том случае, когда оператор отрабатывает дольше указанного числа.

Оптимизация производительности в PostgreSQL

Оптимизация производительности в PostgreSQL является важной частью администрирования базы данных, так как улучшенная производительность бд может существенно повысить масштабируемость и отзывчивость приложений. Рассмотрим некоторые ключевые способы оптимизации производительности в PostgreSQL:
  1. Оптимизация запросов. Оптимизация запросов путём создания нужных индексов может значительно улучшить производительность базы данных.
  2. Подготовка SQL-запросов. Подготовленные запросы позволяют PostgreSQL кэшировать и повторно использовать их, что снижает нагрузку на бд.
  3. Настройка параметров PostgreSQL. Оптимальная настройка параметров сервера PostgreSQL: например, shared_buffers, effective_cache_size, work_mem и другие.
  4. Использование репликации. Распределение нагрузки с использованием бэкапа поможет улучшить общую производительность. Узнать больше в статье «Что такое репликация в PostgreSQL?».
  5. Мониторинг производительности. Важно отслеживать использование памяти, ввод-вывод, сетевые запросы и другие параметры системы. Постоянный мониторинг производительности с использованием pg_stat_statements, pg_stat_monitor и других инструментов может помочь найти и устранить неполадки.
Так, улучшение производительности в PostgreSQL требует понимания работы базы данных и глубоких знаний PostgreSQL. Специалисты группы компаний «ДБ-Сервис» уже более 15 лет качественно предоставляют услуги по администрированию наиболее СУБД: PostgreSQL, MS SQL Server, Oracle.

Поддержка баз данных PostgreSQL включает мониторинг в режиме 24х7, ускорение производительности, аудиты, миграцию с других бд. Узнать подробнее здесь.

Эксперт ДБ-сервис

Список литературы:
  1. Оптимизация производительности баз данных PostgreSQL.  – Текст: электронный // SergeyEm: интернет-ресурс.
  2. Explaining EXPLAIN. – Текст: электронный // Enterprise: DB: интернет-ресурс.
  3. F.32. pg_stat_statements — track statistics of SQL planning and execution #Roles and Privileges. – Текст: электронный // The PostgreSQL Global Development Group: интернет-ресурс.
  4. PostgreSQL Index Usage Analysis.  – Текст: электронный // stackoverflow: интернет-ресурс.