Using EXPLAIN/ru
Чтобы выяснить причины длительного выполнения запроса, воспользуйтесь командой EXPLAIN.
Выполнить ее можно двумя способами:
- EXPLAIN ANALYZE фактически выполнит запрос, что позволит сравнить ожидаемый план запроса с непосредственно выполненным. Внимание! Если запрос манипулирует данными, то выполнение с EXPLAIN ANALYZE также приведет к изменениям.
- EXPLAIN выведет ожидаемый план выполнения без обращения к данным.
Существуют инструменты, упрощающие анализ вывода EXPLAIN:
- pgAdmin включает инструмент визуализации вывода EXPLAIN. См. Интерпретация графического представления планов в PgAdmin.
- Visual Explain, изначально выпущенный в составе компонента RedHat, и позже доработанный EnterpriseDB, сейчас поставляется в составе пакета EnterpriseDB Advanced Server. Его можно собрать для использования с PostgreSQL из исходного кода Developer Studio.
- explain.depesz.com выводит план с акцентом на суммарные и промежуточные временные затраты и выбранные критерии.
Ниже приведены ссылки на материалы:
- Подсказки по производительности
- Эффективный SQL Грега Сабино Муллана (Greg Sabino Mullane), 2003
- Разъяснения по Explain: pdf и презентация OpenOffice Роберта Трита (Robert Treat), 2005
- Разъяснения по Explain Лукаса Смита (Lukas Smith), 2006
- Разъяснения по Explain Грега Старка (Greg Stark), 2008
- Техники выполнения запросов в PostgreSQL Нила Конвея (Neil Conway)
- Введение в VACUUM, ANALYZE, EXPLAIN, и COUNT Джима Нэсби (Jim Nasby)
- Планировщик запросов PostgreSQL Роберта Хааса (Robert Haas), 2010
- Высокопроизводительный PostgreSQL 9.0, 2010. Это книга, глубоко затрагивающая предмет использования EXPLAIN, чтения планов и принятия мер по оптимизации.
Основной проблемой выбора плохих планов является устаревание статистики планировщика. Другая проблема заключается в игнорировании настройки параметров памяти сервера, чаще всего используются значения по умолчанию, а они ничтожно малы. Например, в минимальной конфигурации, сортировки, для которых требуется больше 1MB памяти, будут писаться на диск. Настройка вашего сервера PostgreSQL освещает лучшие практики по расчету памяти и другим параметрам оптимизации, оказывающим влияние на планы запросов.
Если вы не можете самостоятельно разобраться с планом, обратитесь к рассылке pgsql-performance, предоставив полный вывод EXPLAIN ANALYZE, схему и проблемные запросы. Чтобы получить ответы стоящие и быстро, прочтите вопросы по медленным запросам перед тем, как задать вопрос. Также, если вы используете версию PostgreSQL отличную от текущей стабильной, вполне возможно, что эта проблема уже решена в последней. Обновление в рамках мажорной версии потенциально может сэкономить ваше время. Например, обновитесь с версии 8.2.3 до 8.2.6 и посмотрите повторно на план выполнения. Помогло?
Продвинутой техникой является периодическое сохранение планов по мере роста объема данных таблиц и проведение их сравнительного анализа. Это может натолкнуть на мысль об изменении агрессивности сбора статистики, например. Простой пример на pl/pgsql приведен в обсуждении Общие возможности Explain.