Intereting Posts
Как показать журнал запросов SQL, созданный с помощью теста RSpec? Насколько плохо работает оператор IN для выполнения SQL-запросов? Informix SQL – список всех полей и таблиц ASP.NET – Сохранение SQL-запросов в глобальном файле ресурсов? Отображение запроса кросс-таблицы с параметром в качестве объекта исходного объекта Выберите данные из диапазона дат между двумя датами Как рассчитать время между записями в SQL Server 2008 возможно ли вставить на основе выбора в одном из столбцов в MySQL? Match Regex в MySQL для повторного слова с условием исключает круглые скобки Обновить запрос для изменения существующих значений для столбца в одной таблице на основе значений из другой таблицы SQL: внешний ключ, являющийся дочерним элементом другого внешнего ключа Как получить счет из всей таблицы, содержащей конкретный столбец? Как использовать предложение IN в iBATIS? Oracle 10g / 11g для Mac Что означает, когда Statement.executeUpdate () возвращает -1?

Когда подходит NOLOCK?

Время от времени у меня возникают тайм-аут и взаимоблокировки с некоторыми длинными запросами.

Мне интересно, когда наиболее целесообразно использовать NOLOCK и где?

Я использую его для обновлений и вставок? или читает?

Обратите внимание, что вы можете указать nolock для каждой таблицы.

Я обычно использовал nolock в сложных запросах SELECT, но только для небольших таблиц поиска, которые почти никогда не менялись, и для данных только для отображения. Вы знаете таблицы, в которых перечислены цены за текущие полгода, или запросы идентификаторов на строки и т. Д. Материал, который изменяется только с основными обновлениями, после чего серверы обычно перезапускаются в любом случае.

Это значительно улучшило производительность, уменьшило вероятность тупика в самые загруженные моменты, и, что более важно, это было действительно примечательно в моменты наихудшего случая для запросов, которые касались большого количества таблиц (что логично, они должны получить меньше блокировок и эти скрытые элементы часто используются почти везде, часто уменьшаясь с 7-8 до 4 таблиц, которые необходимо заблокировать)

Но будьте очень осторожны, добавляя его, не торопите и не делайте это регулярно. Это не повредит при правильном использовании, но при неправильном использовании оно будет ужасно болеть.

Не используйте его для критически важных вещей, вещей, которые вычисляют и т. Д., Потому что он будет несовместимым, все, что рано или поздно приведет к написанию.

Другая такая оптимизация – ROWLOCK, которая только фиксируется на уровне строки. Это в основном полезно при обновлении (или удалении) таблиц, где строки не связаны друг с другом, например таблицы, в которые вы помещаете только записи журнала (и порядок, в который они вставлены, не имеет значения). Если у вас есть схема, что где-то в конце транзакции запись журнала записывается в некоторую таблицу, это также может значительно ускориться.

Если ваша база данных имеет относительно низкий процент, она может не стоить того. У меня было соотношение read: write менее 2: 1.

Некоторые URL-адреса, которые я сохранил при работе над этим:

http://www.developerfusion.com/article/1688/sql-server-locks/4/

В SQL Server существует четыре уровня изоляции транзакций :

  1. ПРОЧИТАТЬ НЕОБХОДИМО
  2. ЧИТАЙТЕ КОМИТЕТ
  3. ПОВТОРНЫЙ ПРОЧИТАЙТЕ
  4. SERIALIZABLE

Для таблиц, к которым он применяется, NOLOCK является эквивалентом «read uncommitted». Это означает, что вы можете видеть строки из транзакций, которые могут быть отброшены в будущем, и многие другие странные результаты.

Тем не менее, нолок работает на практике очень хорошо. Особенно для запросов только для чтения, где отображение немного неправильных данных не является концом мира, например бизнес-отчетами. Я бы избегал этого рядом с обновлениями или вставками или вообще рядом с кодом принятия решений, особенно если он включает в себя счета-фактуры.

В качестве альтернативы nolock рассмотрите «прочитанный фиксированный снимок», который предназначен для баз данных с интенсивным чтением и меньшей активностью записи. Вы можете включить его с помощью:

 ALTER DATABASE YourDb SET READ_COMMITTED_SNAPSHOT ON; 

Он доступен для SQL Server 2005 и выше. Это то, как Oracle работает по умолчанию, и именно это использует сам stackoverflow. Об этом даже пишет запись блога ужасов .

PS Длинные запросы и взаимоблокировки могут также указывать, что SQL Server работает с неправильными предположениями. Проверьте, не устарели ли ваши статистические данные или индексы:

 SELECT object_name = Object_Name(ind.object_id), IndexName = ind.name, StatisticsDate = STATS_DATE(ind.object_id, ind.index_id) FROM SYS.INDEXES ind order by STATS_DATE(ind.object_id, ind.index_id) desc 

Статистика должна обновляться в недельном плане обслуживания.

Используйте nolock как последнее средство. Большинство проблем взаимоблокировки можно устранить, настроив запросы и / или настроив индексы. Я думаю, что за последние 5 лет я видел один тупик, который не мог быть исправлен путем настройки одного из двух.

Также обратите внимание на то, что NOLOCK выполняется только в некоторых операторах. Модификации данных всегда будут блокироваться, это поведение не может быть изменено. Поэтому, если у вас есть тупик писателя / писателя (довольно распространенный), никакой блокировки не поможет вообще.

Также имейте в виду, что nolock в дополнение к возврату грязных данных может привести к дублированию строк (строки читаются дважды из базовой таблицы) и отсутствующие строки (строки в базовой таблице, которые не были прочитаны вообще).

Nolock по существу означает SQL Server «Я не возражаю, если мои результаты немного неточны»

Изоляция снимка является опцией. Просто убедитесь, что вы сначала тщательно протестировали, так как повышенная нагрузка на TempDB может быть довольно серьезной, в зависимости от того, насколько часты и длительны ваши транзакции. Также обратите внимание, что пока вы не увидите взаимоблокировки в изоляции моментальных снимков, вы можете получить конфликты обновления. Опять же, проверьте и убедитесь, что ваши приложения работают правильно и могут обрабатывать любые ошибки, которые они получают.

Используйте его, когда приемлемо иметь грязные чтения и фантомные записи. Т.е. у вас могут быть некритические отчеты, которые регулярно выполняются там, где точность информации не является основным драйвером, но имеет представление об объеме записей или, например, какую-либо другую метрику

Вы должны использовать nolock, когда нормально читать грязные данные. Большая транзакция, которая может внести ряд изменений в базу данных, может продолжаться, использование nolock только вернет данные, которые она установила до сих пор. Если эта транзакция, то откат данных, которые вы смотрите, может быть неправильным. Поэтому вы должны использовать его только тогда, когда неважно, что то, что вы вернетесь, может быть неправильным.

Тупики – общая проблема, но 9 раз из 10 полностью вызваны проблемой разработчика. Я хотел бы сосредоточиться на поиске причины тупиков, а не на использовании nolock. Скорее всего, одна транзакция делает вещи в другом порядке всем остальным. Исправлено только то, что все ваши проблемы могут исчезнуть.

Для совместимого с транзакциями просмотра без блокировок чтения рекомендуется включить изоляцию моментальных снимков в SQL Server.

Это немного отличается от NOLOCK, поскольку при чтении информации результаты всегда отражают версию данных, а не возможность просмотра неработающих данных. Это обеспечивает тот же параллелизм блокировки, что и NOLOCK (без «чтения») с более ясными результатами.

Следует всегда иметь в виду, даже с последовательностью транзакций, данные, которые вы затем используете для отображения или использования на момент его отображения, могут быть в любом случае ошибочными или устаревшими. Я видел, что слишком многие люди предполагают, что если они будут использовать данные достаточно быстро или если они используют его в запросе / транзакции, это нормально. Это абсурдно – по моему мнению, повторные уровни согласованности никогда не должны были реализовываться в первую очередь, поскольку это просто поощряет плохое поведение. Они не существуют в Oracle.

Лично я увлекаюсь блокировкой блокировки для некоторых некритических просмотров данных и отчетов, так как это снижает нагрузку на систему, и небольшая пробоаблемия предоставления слегка неточных результатов не является проблемой.

Использование повторяющихся уровней согласованности чтения и совершение грехов, таких как проведение открытых транзакций для ввода пользователем, может быть немного проще для разработчиков с точки зрения первоначальной разработки, но почти всегда приведет к основным «дорожным» блокам в любую надежду на разумное масштабирование вашего приложения ,

Мое мнение – лучший подход – всегда выполнять условия «двойной проверки», которые все еще должны быть истинными, чтобы применять обновления к любым данным.

Плохо:

 UPDATE myaccount SET balance = 2000 

Лучше:

 UPDATE myaccount SET balance = balance + 2000 

Еще лучше:

 UPDATE myaccount SET balance = 2000 WHERE balance = 0 AND accountstatus = 1 

Наконец, приложение должно проверять количество строк, чтобы убедиться, что ожидаемое количество строк было фактически обновлено до того, как пользователь получит обратную связь с успехом.