Как оптимизировать производительность выражений SELECT в SQL
Производительность базы данных SQL возможно улучшить. Один из способов оптимизации - проработка в обращении с ней выражений SEL ECT.
Итак, что от нас потребуется?
Проверка индексов
Проверьте операторы JOIN и WHERE: для всех полей, в которых они используются, должны быть индексы.
Ограничение рабочего набора данных
Оцените таблицы, использующиеся вместе с SEL ECT. Можно ли применить к ним фильтры? Часто бывает так, что запросы исполняются молниеносно тогда, когда в БД лишь несколько тысяч строк в таблице. Но все течет, все меняется! Приложение растет, заспросы выполняются все медленнее. Из-за размазанности этого процесса во времени, неясно, когда время все-таки оптимизировать запросы пришло.
Но это достаточно просто: нужно всего лишь ввести в запрос ограничение на данные сегодняшнего месяца. В случае, если вы используете в запросе вложенный SELECT, примените к внутренним выражениям фильтры.
Выбор необходимых полей
Чем больше будет дополнительных полей, тем больше данных получит ваш SQL-клиент. Ваш запрос может выполниться молниеносно, но потом придется еще выполнять агрегацию детально полученных данных, т.е. и вычислительный ресурс, и время будут потрачены на информацию, которая вам не нужна.
Если вы используете столбцовые базы данных, то имейте ввиду, что чтобы снизить нагрузку на ввод-вывод, надо будет запрашивать меньше столбцов.
Удаление лишних таблиц
То же самое, что и в случае с дополнительными полями - чем их меньше, тем лучше. Очень часто в запросе есть таблицы, которые вообще не влияют на получаемые данные, так что если нужно снизить нагрузку на базу данных - смело удаляем JOIN к лишним таблицам!
Удаление OUTER JOIN
Тут все будет зависеть от того, все ли вы можете удалять в таблицах. Самое простое решение - удалить OUTER JOIN посредством замещения в обеих таблицах.
Например, если у вас есть 2 таблицы, использующих OUTER JOIN, то вам нужно будет вставить дополнительные строки в таблицах с клиентами, заменяя все показатели NULL на "заменитель".
Это не только снимает необходимость в операторе, но стандартизирует таблицы и упрощает работу разработчиков.
Удаление вычисляемых полей из WHERE и JOIN
Опять же, в зависимости от того, насколько вы можете вносить изменения в схемы данных, это может быть легко или просто. Но провернуть эту операцию можно уже в случае, если есть возможность создания поля с вычисляемым значением, использующимся в JOIN.
Например, у нас есть выражение:
1. FR OM sales a
2. JOIN budjet b ON ((year(a.sale_date)) * 100) + month(a.sale_date)) = b.budget_year
Меняем его, добавляя столбец с годом и месяцем в таблицу продаж:
1. SELECT * FR OM PRODUCTSFROM sales a
2. JOIN budjet b ON a.sale_year_month = b.budget_year