Параллелизм при длительном обновлении в TSQL - PullRequest
3 голосов
/ 06 июля 2010

Использование Sql Server 2005. У меня длительное обновление, которое может занять около 60 секунд в нашей производственной среде.Обновление не является частью каких-либо явных транзакций и не имеет никаких SQL-подсказок.Во время выполнения обновления, что ожидать от других запросов, которые будут появляться в тех строках, которые будут обновлены?Всего в таблице будет обновлено около 6 миллионов строк, из которых будет обновлено около 500 000 строк.

Некоторые проблемы / вопросы параллелизма:

1) Что если другой запрос select (с nolockПодсказка) выполняется для этой таблицы среди некоторых строк, которые обновляются.Будет ли запрос ждать до завершения обновления?

2) Что другой запрос select не имеет подсказки nolock?Будет ли этот запрос ждать до завершения обновления?

3) Что если другой запрос на обновление выполняет обновление одной из этих строк?Будет ли этот запрос ждать до его завершения?

4) А что насчет удаления?

5) А что насчет вставок?

Спасибо!Dave

1 Ответ

0 голосов
/ 06 июля 2010

Каждый оператор на сервере sql выполняется в транзакции. Если вы явно не запускаете один, сервер запускает один для каждого оператора и фиксирует его, если оператор выполнен успешно, и откатывает его, если это не так.

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

Если ваш select запускается с nolock, то вы получите грязное чтение, если вам удастся выбрать какие-либо строки, которые участвуют в обновлении. Это означает, что вы будете читать непереданные данные, и они могут не соответствовать другим строкам (так как они, возможно, еще не были обновлены).

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

...