Уменьшить взаимоблокировку на уровне PAGE при запросе обновления на MS SQL - PullRequest
5 голосов
/ 26 ноября 2008

У меня есть забавный тупик, вызванный глупым простым запросом SQL UPDATE, на плоской простой таблице, по умолчанию транзакция READ COMMITED.

UPDATE table SET column=@P1 WHERE PK=@P2

Столбец PK равен varchar(11), имеет кластеризованный индекс. нет триггера или табличного отношения .. и т. д. для таблицы.

Я сделал некоторую проверку и обнаружил, что тупик случается на уровне «PAGE», а не на уровне ROW / записи. Затем я обнаружил, что для каждого запроса на обновление требуется 100 (и более) блокировок PAGE. (Это не имеет смысла для меня, потому что я обновляю одну строку сразу)

Есть ли способ предотвратить возникновение тупика? Или как уменьшить количество блокировок, необходимых для обновления одной строки без использования курсора?

-

Спасибо за ваше предложение.

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

-

Я попробовал SQL Server Profiler. Я записал несколько «Lock: Deadlock Chain» и «Lock: Deadlock», но «График тупиков» не был захвачен. Обе стороны выполняют простой запрос на обновление в режиме автоматической фиксации чтения.

Lock:Deadlock Chain 17887475    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887476    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102                                                                                                                                                                                                                                                          265006271       0   0X56AF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887477    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887478    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206                                                                                                                                                                                                                                                           265006240       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887479    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206                                                                                                                                                                                                                                                          265006271       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887480    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887481    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066                                                                                                                                                                                                                                                           265006240       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887482    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066                                                                                                                                                                                                                                                          265006271       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887483    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887484    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614                                                                                                                                                                                                                                                          265006271       0   0X8E7E060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887485    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887486    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687                                                                                                                                                                                                                                                          265006271       0   0XBF82060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887487    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887488    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392                                                                                                                                                                                                                                                          265006271       0   0XB07D060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887489    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887491    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887493    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887494    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792                                                                                                                                                                                                                                                          265006271       0   0X50A6060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887495    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887496    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206                                                                                                                                                                                                                                                          265006271       0   0XBEAF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock   17887497        myuser  0XCD85FBB269700B4AA2F4E8579D118999  209 myserver    myuser  2008-11-28 10:16:45.930 1:426206    265006271   myapps  0   0XDE80060001000000000000001B0006    123 27  281 2008-11-28 10:16:46.210 myclient    0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971498                  

Ответы [ 6 ]

4 голосов
/ 26 ноября 2008

У вас есть 2 варианта уменьшения эскалации блокировки:

1) добавьте подсказку WITH (ROWLOCK), чтобы сервер sql запросил более тонкие блокировки гранулярности (ваш пробег может варьироваться:

ОБНОВЛЕНИЕ таблицы с (ROWLOCK) SET столбец = @ P1, ГДЕ PK = @ P2; Пока ПК varchar (11), имеет кластерный индекс на Это. нет отношения тигра или таблицы .. и т. д. на столе.

2) обновлять строки в случайном порядке, что снижает вероятность перерастания блокировок строк в блокировки страниц.

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

1 голос
/ 27 ноября 2008

Вы запустили трассировку профиля?

Запустите SQL Profiler и создайте стандартную трассировку с добавленными событиями:

  • Замки: График тупиков
  • Замки: Блокировка: тупиковая цепь
  • Замки: Замок: Эскалация

Должен предоставить подробную информацию о точном характере тупика.

0 голосов
/ 22 января 2009

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

Но все же интересно, как происходит блокировка страницы и как ее решить.


После еще одного поиска в Google есть некоторые другие люди с такой же проблемой, и они (с форума MSDN) предлагают отключить параллелизм в SQL Server 2005, но у меня никогда не было возможности попробовать.

0 голосов
/ 29 декабря 2008

есть ли у вас какие-либо ОБНОВЛЕНИЯ ТРИГГЕРОВ на столе? Если это так, действие триггера может привести к вашей тупиковой ситуации.

0 голосов
/ 27 ноября 2008

Какие операторы выбора из той же таблицы И те же записи происходят внутри одной транзакции перед оператором обновления? Используйте (блокировку обновления) подсказки блокировки в этих селектах.

0 голосов
/ 26 ноября 2008

В обычном простом случае этот тип нищеты встречается не часто. Мой вопрос к вам: что находится на «другой стороне» этой сделки? Какой другой оператор обновления работает и вызывает этот тупик? Это, я думаю, будет ключом к диагностике этой проблемы. Честно говоря, мои деньги на этот другой, до сих пор неустановленный запрос был виновником. И я сейчас в Вегасе ...

...