Популярні хінти в t-sql. Підказки оптимізатору, якими часто користуються. Топ 10

36

Всім привіт! в даному матеріалі представлено 10 популярних хинтов мови t-sql, якими часто користуються розробники і адміністратори баз даних microsoft sql server, іншими словами, ми розглянемо хинти, які часто зустрічаються в коді додатків.

примітка! .

Введення

На самому початку обов’язково варто відзначити, що використовувати хінти потрібно в самих крайніх випадках, при цьому ви повинні чітко розуміти, як зміниться поведінка запиту, як зміниться план виконання запиту.

Справа в тому, що оптимізатор запитів sql server зазвичай будує найоптимальніший план виконання запиту, при цьому в разі змін будь-яких факторів, які впливають на процес формування плану, тобто якщо план запиту з часом стане неоптимальним, sql server автоматично його перебудує.

А в тих випадках, коли ми використовуємо хінти, ми примушуємо sql server діяти певним чином, тобто в разі зміни факторів, що впливають на посторінення плану, цей план не буде перебудований і запит буде виконуватися неефективно.

Тому, якщо ви використовуєте хинти в продакшені, то обов’язково через час перевіряйте необхідність наявності цих хинтов, так як можливо вони вже не потрібні і без них запит буде виконуватися ефективніше.

Топ 10 популярних хинтів

Давайте розглянемо 10 популярних хинтов, які частіше за інших можна зустріти в production, і які ми частіше використовуємо для ad hoc запитів.

Nolock

Цей хінт дозволяє «брудне читання». Поведінка стає схоже на рівень ізоляції read uncommitted. Хінт nolock рівнозначний хінту readuncommitted.

Цей хінт дуже часто зустрічається в аналітичних системах або в процедурах, які виконують якісь аналітичні дії, з метою прискорення вибірок, тобто прискорення отримання даних. При цьому, як ви розумієте, актуальність даних з точністю до секунд не так важлива.

Noexpand

Цей хінт вказує, що при обробці запиту індексоване подання не розширюється для доступу до базових таблиць. Оптимізатор запитів обробляє подання так само, як і таблицю з кластеризованим індексом.

Хінт noexpand застосовується також з метою прискорення вибірки даних.

Recompile

Цей параметр вказує sql server, що план виконання запиту повинен будуватися кожного разу при запуску цього запиту.

Цей хінт застосовується в тих випадках, коли в кеші знаходиться план запиту, невідповідний для поточних параметрів або даних.

Recompile створює певне навантаження на процесор і в разі високонавантажених систем може значно навантажити сервер, тому бажано знаходити інші варіанти оптимізації.

Optimize for

Цей хінт вказує оптимізатору запитів, що при компіляції та оптимізації запитів потрібно використовувати конкретне значення для локальної змінної. Значення використовується тільки в процесі оптимізації запиту, але не в процесі виконання.

Даний хінт часто використовують, коли стикаються з проблемою «parameter sniffing», щоб оптимізувати процедуру під конкретне значення параметра або в разі optimize for unknown під середнє значення.

Tablock

Цей хінт вказує оптимізатору, що отримана блокування застосовується на рівні таблиці.

Хінт tablock часто можна зустріти в інструкціях по масовій вставці даних в таблицю (insert), так як це дозволяє оптимізувати і, як наслідок, прискорити процес вставки даних.

Rowlock

Цей хінт вказує, що замість блокування сторінок або таблиць застосовуються блокування на рівні рядків.

Даний хінт можна зустріти в інструкціях оновлення даних (update), його часто застосовують з метою зниження гранулярності блокування, що в теорії сприяє прискоренню інструкції.

Хінт вказує sql server, що не потрібно зчитувати рядки, які заблоковані іншими транзакціями. Іншими словами, якщо вказано хінт readpast, блокування рівня рядків будуть пропускатися, тобто sql server буде пропускати рядки замість блокування поточної транзакції до тих пір, поки блокування не будуть зняті.

Цей хінт часто використовується для усунення конфлікту блокувань при реалізації будь-якої черги, що використовує таблицю sql server, тобто. Коли записи в таблиці періодично обробляються і пропуск деяких записів неважливий, так як вони можуть потрапити в наступній потік обробки.

Maxdop

Хінт перевизначає параметр конфігурації, що задає максимальний рівень паралелізму.

Maxdop можна часто зустріти в запитах з метою відключення паралелізму (maxdop 1).

Index

Цей хінт вказує індекс, який буде примусово використаний оптимізатором запитів при обробці інструкції, іншими словами, фактично ми прив’язуємо індекс до запиту.

Index використовують для того, щоб sql server завжди застосовував один і той же індекс при побудові плану запиту.

Однак, як вже було зазначено, з часом індекс може стати неефективним, тому періодично необхідно перевіряти запити з хінтом index на предмет їх продуктивності, тобто цей індекс ще ефективний чи ні.

Force order

Цей хінт вказує, що при оптимізації запиту зберігається порядок з’єднання, заданий синтаксисом запиту.

Force order часто використовується в запитах, коли sql server з яких-небудь причин застосовує не той порядок з’єднання, який був би найефективнішим.