Как администратор базы данных SQL Server, не редко возникают разногласия с разработчиками приложений относительно их практик разработки Transact SQL (T-SQL). Особенно спорным является использование подсказки таблицы NOLOCK. В этой статье мы рассмотрим внутреннее устройство подсказки таблицы NOLOCK и рассмотрим последствия опускания ключевого слова WITH.
Понимание подсказки NOLOCK
По умолчанию SQL Server получает общую блокировку перед чтением данных из таблицы, гарантируя чтение только подтвержденных данных. Однако подсказка таблицы NOLOCK позволяет указать оптимизатору запросов читать таблицу без получения эксклюзивной или общей блокировки. Это может быть полезно, так как требуется меньше памяти и предотвращаются блокировки с другими запросами, читающими аналогичные данные. Однако важно отметить, что использование подсказки таблицы NOLOCK может привести к чтению неподтвержденных “грязных” данных.
Практические примеры
Давайте рассмотрим сценарий, в котором нам нужно обновить номер майки игрока в таблице SQL Server. Если другой пользователь попытается прочитать обновленный номер майки до завершения изменений, ему придется ждать завершения обновления. Однако, используя подсказку NOLOCK, мы можем получить номер майки без ожидания общих блокировок.
Вот пример использования подсказки NOLOCK:
SELECT [Jersey Number] FROM [dbo].[2016_FIFABallonDOr] (NOLOCK) WHERE [Nominee] = 'Lionel Messi'
Хотя подсказка NOLOCK может быть полезной, важно знать ее ограничения. Если транзакция, внесшая изменения, откатывается, полученные данные могут быть недостоверными. Поэтому важно обдумать потенциальные риски перед использованием подсказки NOLOCK.
Преимущества использования ключевого слова WITH
Хотя результаты запросов с использованием подсказок NOLOCK и WITH NOLOCK могут выглядеть одинаково, есть несколько причин, почему рекомендуется использовать ключевое слово WITH:
- Устаревание подсказок без ключевого слова WITH: Документация Microsoft говорит о том, что исключение ключевого слова WITH в подсказке таблицы будет устаревать в будущих версиях SQL Server. Рекомендуется включать ключевое слово WITH, чтобы избежать технического долга.
- Указание нескольких подсказок таблицы: Использование ключевого слова WITH позволяет указывать несколько подсказок таблицы для одной и той же таблицы. Опускание ключевого слова WITH и указание нескольких подсказок приведет к ошибке.
- Предотвращение путаницы с псевдонимами таблиц: Опускание ключевого слова WITH может привести к путанице, так как подсказка NOLOCK может быть принята за псевдоним таблицы. Это может привести к ожиданию общей блокировки перед чтением таблицы.
Включая ключевое слово WITH, вы обеспечиваете ясность и избегаете потенциальных проблем при использовании подсказок таблиц в ваших скриптах T-SQL.
Заключение
Подсказка таблицы NOLOCK может быть полезным инструментом в SQL Server, позволяющим ускорить получение данных и предотвратить блокировки. Однако важно понимать последствия и риски, связанные с использованием подсказки NOLOCK. Включая ключевое слово WITH, вы гарантируете совместимость ваших скриптов с будущими версиями, позволяете использовать несколько подсказок таблицы и избегаете путаницы с псевдонимами таблиц. Всегда обдумывайте преимущества и недостатки перед включением подсказки таблицы NOLOCK в ваши скрипты T-SQL.