Оптимизация запросов — это функция СУБД, осуществляющая поиск оптимального плана выполнения запросов из всех возможных для заданного запроса или же процесс изменения запроса и/или структуры БД с целью уменьшения использования вычислительных ресурсов при выполнении запроса. Один и тот же результат может быть получен СУБД различными способами (планами выполнения запросов), которые могут существенно отличаться как по затратам ресурсов, так и по времени выполнения. Задача оптимизации заключается в нахождении оптимального способа.
Причины ресурсоемкости запроса могут быть следующие:
- плохая статистика по таблицам и индексам запроса;
- проблемы с индексами в запросе;
- проблемы с хинтами в запросе;
- неэффективно построенный запрос;
- неправильно настроены параметры инициализации базы данных, отвечающие за производительность запросов.
1. Проблемы с индексами
Отсутствие нужного индекса. Требуемое действие — создать новый индекс;
Построен эффективный индекс, но он работает не эффективно в силу следующих причин:
- Индекс заблокирован от использования. Блокируют использование индекса следующие операции над столбцом, по которому используется индекс: SUBSTR, NVL, DECODE, TO_CHAR,TRUNC,TRIM, ||конкатенация, + цифра к цифровому полю и т.д. Решение – модифицировать запрос, освободиться от блокирующих операций или создать индекс по функции, блокирующей индекс.
- Не собрана или неактуальная статистика по индексу. Решение – собрать статистику по индексу запуском процедуры, указанной выше. — Имеется хинт, блокирующий работу индекса, например NO_INDEX.
- Неэффективно настроены параметры инициализации базы данных БД (особенно отвечающие за эффективную работу индексов, например, optimizer_index_caching и optimizer_index_cost_adj). Эффективность работы индексов повышалась, если optimizer_index_caching=95 и optimizer_index_cost_adj=1.
2. Неэффективно написанный запрос. К пример:
- неэффективное соединение таблиц;
- использование NOT и NOT IN в условии where;
- блокировка индекса в силу использования неправильных функций к столбцу, по которому построен индекс;
- большая вложенность запроса или большая его длина;
- большой объем выбираемых данных, требующих подключения в работу дисков, в том числе для выполнения агрегированных функций (order by, group by и т.д.);
- неэффективные хранимые процедуры.