17
Пути оптимизации
Цель оптимизации — получить адекватный план
Исправление неэффективностей
каким-то образом найти и исправить узкое место
бывает сложно определить, в чем проблема
часто приводит к борьбе с планировщиком
Правильный расчет кардинальности
добиться правильного расчета кардинальности в каждом узле
и положиться на планировщик
если план все еще неадекватный, настраивать глобальные параметры
Цель оптимизации запроса — получить адекватный план выполнения.
Есть разные пути, которыми можно идти к этой цели.
Можно посмотреть в план запроса, понять причину неэффективного
выполнения и сделать что-то, исправляющее ситуацию. К сожалению,
проблема не всегда бывает очевидной, а исправление часто сводится
к борьбе с оптимизатором.
Если идти таким путем, то хочется иметь возможность целиком или
частично отключить планировщик и самому создать план выполнения.
Такая возможность называется подсказками (хинтами) и в явном виде
отсутствует в PostgreSQL.
Другой подход состоит в том, чтобы добиться корректного расчета
кардинальности в каждом узле плана. Для этого, конечно, нужна
аккуратная статистика, но этого часто бывает недостаточно.
Если идти таким путем, то мы не боремся с планировщиком,
а помогаем ему принять верное решение. К сожалению, это часто
оказывается слишком сложной задачей.
Если при правильно оцененной кардинальности планировщик все
равно строит неэффективный план, это повод заняться настройкой
глобальных конфигурационных параметров.
Обычно имеет смысл применять оба способа, смотря по ситуации
и сообразуясь со здравым смыслом.