9 best practices написания SQL запросов
Если вы читаете эту статью, то, скорее всего, уже знакомы с SQL. Вы знаете, как писать основные SQL-запросы. Однако не все SQL-запросы одинаковы. Большинство из них можно оптимизировать, если использовать best practices.
В этой статье рассматриваются 9 советов по оптимизации SQL-запросов. После прочтения, вы будете знать, что нужно использовать, а что - нет.
1. Избегайте звездочки в SELECT (SELECT *)
Это одна из самых важных best practices SQL. Запрос SELECT * возвращает записи из всех столбцов таблицы. И хотя иногда это действительно нужно, часто такой запрос приводит к многочисленным проблемам:
- Может быть вам не нужны все столбцы таблицы. Однако SELECT * возвращает их все, потребляя излишние ресурсы для выполнения запроса по сети.
- Имена столбцов в таблице могут быть изменены или удалены, а также могут быть добавлены новые столбцы. Таким образом, вы можете получить неожиданные результаты для запроса SELECT *. Лучше указывать имена столбцов.
- SELECT * медленнее, чем SELECT имя_столбца, потому что последний может использовать индексы столбцов для возврата данных.
- Порядок столбцов, возвращаемых SELECT *, не контролируется вами. Но вы определяете желаемый порядок, когда указываете имена столбцов.
2. Используйте WHERE и HAVING правильно
Операторы WHERE и HAVING в SQL выполняют разные функции. Следовательно, мы должны использовать их по-разному. Ниже приведены три основных варианта использования WHERE и HAVING:
- WHERE можно использовать в CRUD-запросах, т.е. SELECT, INSERT, UPDATE, DELETE. С другой стороны, HAVING можно использовать только с оператором SELECT.
- WHERE фильтрует данные перед любой операцией агрегирования, такой как GROUP BY. Затем его можно использовать без какой-либо функции агрегирования. HAVING следует использовать после агрегации.
- Мы можем использовать функции агрегирования, такие как SUM, MIN, MAX COUNT с оператором HAVING. С WHERE мы не можем использовать агрегатные функции, если только оно не является частью подзапроса, содержащегося в HAVING.
3. Используйте INNER JOIN вместо WHERE для объединения таблиц
Оператор JOIN является, наверное, одним из самых полезных в SQL. Он позволяет выбрать данные из нескольких таблиц. И хотя можно использовать WHERE для получения агрегированных данных из двух таблиц, такой оператор крайне неэффективен.
WHERE возвращает CROSS JOIN, который является декартовым произведением записей в обоих столбцах. Например, если у вас есть 1 000 записей в таблице A и столько же записей в таблице B, предложение WHERE создаст CROSS JOIN с 1 000 x 1 000 = 1 000 000 записей.
Если столбцы таблиц A и B, участвующие в WHERE, имеют только 1 000 общих значений, WHERE вернет 1 000 записей из исходных 1 000 000 записей, созданных с помощью декартова произведения.
INNER JOIN же возвращает только 1 000 записей, в которых обе таблицы A и B имеют общие значения в столбцах. В этом случае INNER JOIN выполняет в 1 000 раз меньше работы, чем оператор WHERE.
Некоторые базы данных самостоятельно преобразуют WHERE в INNER JOIN. Однако всегда рекомендуется использовать INNER JOIN в явном виде вместо оператора WHERE.
4. Используйте EXISTS, NOT EXISTS вместо IN и NOT IN
Всегда используйте EXIST вместо IN, когда нужно проверить существование значения в определенной таблице.
Процесс, выполняющий запрос EXISTS, останавливается, как только находит нужное значение в таблице. В то же время IN сканирует все таблицы даже после нахождения необходимого значения.
Точно так же при поиске несуществующего в таблице значения всегда следует использовать NOT EXISTS вместо NOT IN.
5. Используйте оператор Equals (=) вместо оператора LIKE
Для поиска строк можно использовать операторы = и LIKE. Основное различие между ними заключается в том, что оператор LIKE используется для поиска подстановочных знаков, таких как %, для поиска частичных строк, в то время как оператор равенства "=" ищет точные совпадения.
Если вам приходится выбирать между этими двумя операторами, всегда отдавайте предпочтение оператору равенства ("="), так как он использует индексированные столбцы. Следовательно, он быстрее, чем оператор LIKE.
6. Используйте LIMIT для сокращения результатов поиска
Если вам нужно вернуть данные из нескольких таблиц или столбцов, используйте оператор LIMIT (также известный как оператор TOP), чтобы сократить количество результатов запроса. Если имеются тысячи столбцов или вы хотите посмотреть, как выглядят данные только в указанных таблицах, нет необходимости возвращать все строки. Вместо этого ограничьте количество строк, возвращаемых запросом SELECT, с помощью предложения LIMIT в сочетании с ним.
7. Используйте алиасы таблиц
Чтобы избежать путаницы и предотвратить парсинг базами данных имен столбцов при поиске таблицы, к которой они относятся, всегда используйте алиасы таблиц.
8. Избегайте префиксации хранимых процедур с помощью "sp_"
Если вы работали с хранимыми процедурами, то, скорее всего, в имени хранимой процедуры вы ставили префикс "sp_". Это не самый лучший вариант.
SQL Server начинает поиск хранимых процедур с "sp_" в начале их имен в главной (master) базе данных, а затем переходит к поиску в других местах.
Поэтому вы можете сэкономить много времени, если не будете добавлять к имени хранимой процедуры префикс "sp_" Тогда, вместо того чтобы пытаться найти хранимую процедуру в главной базе данных, SQL-сервер будет напрямую проверять dbo как владельца хранимой процедуры.
9. Придерживайтесь хорошего стиля написания запросов
При написании SQL-запросов необходимо придерживаться правильного стиля. Обратите внимание на приведенные ниже рекомендации по улучшению стиля написания запросов:
- Всегда добавляйте комментарии к SQL-запросам. Комментарии не только помогут другим членам команды лучше понять ваши запросы, но и напомнят вам, что вы сами делали в прошлом.
- Используйте понятные имена. База данных, таблицы, имена столбцов, временные таблицы и другие имена переменных должны быть на 100% читаемыми и понятными.
- По возможности делайте отступы в запросах. Внутренние запросы должны иметь отступ на один tab слева. Имена столбцов таблицы также должны иметь отступ. Отступы обеспечивают более чистый вид и улучшают читабельность.
Заключение
SQL - очень гибкий язык, предоставляющий множество способов выполнения необходимых задач в базе данных. Чтобы сделать приложения более эффективными и производительными и избежать долгосрочных проблем с базой данных, применяйте современные best practices при написании SQL запросов. Они помогут вам улучшить производительность, избежать ненужных действий и сделать всю вашу работу более лаконичной и прозрачной.
Оригинал статьи: https://codingsight.com/sql-query-optimization-tips/