Что это делает? - PullRequest
       6

Что это делает?

2 голосов
/ 09 апреля 2011

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

WHILE EXISTS (SELECT * FROM aspnet_users WITH (NOLOCK)  
    WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete))
BEGIN
  SET ROWCOUNT 1000
  DELETE FROM aspnet_users WHERE userID IN (SELECT UserID FROM #AspnetUsersToDelete )
  print 'aspnet_Users deleted: ' + CONVERT(varchar(255), @@ROWCOUNT) 
  SET ROWCOUNT 0
  WAITFOR DELAY '00:00:01'
END

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

Ответы [ 3 ]

6 голосов
/ 09 апреля 2011

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

Для SQL Server 2005+ вы можете использовать DELETE TOP (1000)... вместоSET ROWCOUNT заявления.Я обычно делаю:

SELECT NULL; /* Fudge @@ROWCOUNT value for first time in loop */

WHILE (@@ROWCOUNT <> 0) BEGIN
    DELETE TOP (1000)
    ...
END /* WHILE */
2 голосов
/ 09 апреля 2011

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

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

2 голосов
/ 09 апреля 2011

SET ROWCOUNT 1000 означает, что он обработает только одну тысячу строк в следующих инструкциях (то есть, оператор DELETE). SET ROWCOUNT 0 означает, что каждый оператор обрабатывает сколько угодно строк.

Таким образом, по сути, он удаляет одну тысячу строк, ждет секунду, удаляет еще одну тысячу и продолжает это, пока больше не будет удаляться.

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

http://www.mollerus.net/tom/blog/2008/03/using_mssqls_nolock_for_faster_queries.html

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