Всем привет! В данном материале представлено 10 популярных хинтов языка T-SQL, которыми часто пользуются разработчики и администраторы баз данных Microsoft SQL Server, иными словами, мы рассмотрим хинты, которые часто встречаются в коде приложений.
Введение
В самом начале обязательно стоит отметить, что использовать хинты нужно в самых крайних случаях, при этом Вы должны четко понимать, как изменится поведение запроса, как изменится план выполнения запроса.
Дело в том, что оптимизатор запросов SQL Server обычно строит самый оптимальный план выполнения запроса, при этом в случае изменений каких-либо факторов, которые влияют на процесс формирования плана, т.е. если план запроса со временем станет неоптимальным, SQL Server автоматически его перестроит.
А в тех случаях, когда мы используем хинты, мы принуждаем SQL Server действовать определенным образом, т.е. в случае изменения факторов, влияющих на посторенние плана, этот план не будет перестроен и запрос будет выполняться неэффективно.
Поэтому, если Вы используете хинты в продакшене, то обязательно спустя время проверяйте необходимость наличия этих хинтов, так как быть может они уже не нужны и без них запрос будет выполняться эффективнее.
Заметка! План выполнения запроса в SQL Server – что это такое и для чего он нужен.
ТОП 10 популярных хинтов
Давайте рассмотрим 10 популярных хинтов, которые чаще других можно встретить в production, и которые мы чаще используем для Ad Hoc запросов.
NOLOCK
Данный хинт разрешает «грязное чтение». Поведение становится похоже на уровень изоляции READ UNCOMMITTED. Хинт NOLOCK равнозначен хинту READUNCOMMITTED.
Этот хинт очень часто встречается в аналитических системах или в процедурах, которые выполняют какие-то аналитические действия, с целью ускорения выборок, т.е. ускорения получения данных. При этом, как Вы понимаете, актуальность данных с точностью до секунд не так важна.
NOEXPAND
Этот хинт указывает, что при обработке запроса индексированное представление не расширяется для доступа к базовым таблицам. Оптимизатор запросов обрабатывает представление так же, как и таблицу с кластеризованным индексом.
Хинт NOEXPAND применяется также с целью ускорения выборки данных.
RECOMPILE
Данный параметр указывает SQL Server, что план выполнения запроса должен строиться каждый раз при запуске этого запроса.
Этот хинт применяется в тех случаях, когда в кэше находится план запроса, неподходящий для текущих параметров или данных.
RECOMPILE создает определенную нагрузку на процессор и в случае высоконагруженных систем может значительно нагрузить сервер, поэтому желательно находить другие варианты оптимизации.
Заметка! Что нужно знать и уметь разработчику T-SQL. Технологии, языки, навыки.
OPTIMIZE FOR
Данный хинт указывает оптимизатору запросов, что при компиляции и оптимизации запросов нужно использовать конкретное значение для локальной переменной. Значение используется только в процессе оптимизации запроса, но не в процессе выполнения.
Данный хинт часто используют, когда сталкиваются с проблемой «Parameter sniffing», чтобы оптимизировать процедуру под конкретное значение параметра или в случае OPTIMIZE FOR UNKNOWN под среднее значение.
TABLOCK
Данный хинт указывает оптимизатору, что полученная блокировка применяется на уровне таблицы.
Хинт TABLOCK часто можно встретить в инструкциях по массовой вставке данных в таблицу (INSERT), так как это позволяет оптимизировать и, как следствие, ускорить процесс вставки данных.
ROWLOCK
Этот хинт указывает, что вместо блокировки страниц или таблиц применяются блокировки на уровне строк.
Данный хинт можно встреть в инструкциях обновления данных (UPDATE), его часто применяют с целью снижения гранулярности блокировки, что в теории способствует ускорению инструкции.
Заметка! Всем тем, кто только начинает свое знакомство с языком SQL, рекомендую прочитать книгу «SQL код» – это самоучитель по языку SQL для начинающих программистов. В ней очень подробно рассмотрены основные конструкции языка.
READPAST
Хинт указывает SQL Server, что не нужно считывать строки, которые заблокированы другими транзакциями. Иными словами, если указан хинт READPAST, блокировки уровня строк будут пропускаться, т.е. SQL Server будет пропускать строки вместо блокировки текущей транзакции до тех пор, пока блокировки не будут сняты.
Данный хинт часто используется для устранения конфликта блокировок при реализации какой-либо очереди, использующей таблицу SQL Server, т.е. когда записи в таблице периодически обрабатываются и пропуск некоторых записей неважен, так как они могут попасть в следующей поток обработки.
MAXDOP
Хинт переопределяет параметр конфигурации, задающий максимальный уровень параллелизма.
MAXDOP можно часто встретить в запросах с целью отключения параллелизма (MAXDOP 1).
INDEX
Этот хинт указывает индекс, который будет принудительно использован оптимизатором запросов при обработке инструкции, иными словами, фактически мы привязываем индекс к запросу.
INDEX используют для того, чтобы SQL Server всегда применял один и тот же индекс при построении плана запроса.
Однако, как уже было отмечено, со временем индекс может стать неэффективным, поэтому периодически необходимо проверять запросы с хинтом INDEX на предмет их производительности, т.е. этот индекс еще эффективен или нет.
Заметка! Основы индексов в Microsoft SQL Server.
FORCE ORDER
Данный хинт указывает, что при оптимизации запроса сохраняется порядок соединения, заданный синтаксисом запроса.
FORCE ORDER часто используется в запросах, когда SQL Server по каким-либо причинам применяет не тот порядок соединения, который был бы самым эффективным.
Заметка! Если Вы очень часто используете или встречаете хинт, который я здесь не указал, то расскажите это в комментариях.
А сегодня это все, пока!