3
Инструмент
Профилирование
выделение подзадач
продолжительность
количество выполнений
Что оптимизировать?
чем больше доля подзадачи в общем времени выполнения,
тем больше потенциальный выигрыш
необходимо учитывать затраты на оптимизацию
полезно взглянуть на задачу шире
В предыдущих темах мы разобрались с тем, как работают запросы, из
каких «кирпичиков» строится план выполнения и что влияет на выбор
того или иного плана. Это самое сложное и важное. Поняв механизмы,
с помощью логики и здравого смысла можно разобраться в любой
возникшей ситуации и понять, эффективно ли выполняется запрос
и что можно сделать, чтобы улучшить показатели.
Но как найти тот запрос, который имеет смысл оптимизировать?
В принципе, решение любой задачи оптимизации (не только в контексте
СУБД) начинается с профилирования, хоть этот термин и не всегда
употребляется явно. Мы должны разбить задачу, вызывающую
нарекания, на подзадачи и измерить, какую часть общего времени они
занимают. Также полезна информация о числе выполнений каждой из
подзадач.
Чем больше доля подзадачи в общем времени, тем больше выигрыш
от оптимизации именно этой подзадачи. На практике приходится
учитывать и ожидаемые затраты на оптимизацию: получить
потенциальный выигрыш может оказаться нелегко.
Бывает так, что подзадача выполняется быстро, но часто (это,
например, характерно для запросов, генерируемых ORM-ами). Может
оказаться невозможным ускорить выполнение отдельных запросов,
но стоит задаться вопросом: должна ли подзадача выполняться так
часто? Такой вопрос может привести к необходимости изменения
архитектуры, что всегда непросто, но в итоге дать существенный
выигрыш.