Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Какво е застой на SQL Server?

Има много причини, поради които приложенията може да реагират бавно, но ако потребителите се оплакват от производителност, може да имате работа със застой на SQL Server. За щастие има начини за идентифициране и коригиране на застой на SQL Server и дори предотвратяване на отрицателното му въздействие върху производителността на приложението.

Застой на SQL Server е по същество противопоставяне между два процеса, които се конкурират за изключителен достъп до един и същ ресурс. Тъй като само един процес може да използва ресурс в даден момент, производителността се забавя, докато блокирането не бъде разрешено.

Има два типа блокирания на SQL Server, за които трябва да внимавате:заключване на преобразуване и заключване на цикъл.

Заключването на преобразуване възниква, когато нишка се опитва да преобразува заключване от един изключителен тип в друг изключителен тип, но не може, защото друга нишка вече притежава споделено заключване на ресурса, който първата нишка се опитва да преобразува.

В SQL Server има три типа заключвания на преобразуване:

  • Споделено с изключителна цел (SIX):Това заключване се случва, когато транзакция, която притежава споделено заключване, също има изключително заключване на някои страници или редове.
  • Споделено с актуализация на намеренията (SIU):Това заключване се случва, когато транзакция, която притежава споделено заключване, също има някои страници или редове, заключени със заключване на актуализация.
  • Актуализиране с изключителна цел (UIX):Това заключване се получава, когато транзакция, която съдържа заключване на актуализация, също има изключително заключване на някои страници или редове.

Заключването на цикъла е блокиране на SQL Server, причинено от два процеса, които се борят за изключително заключване на ресурс, който е заключен от другия процес.

Например, Процес 1 държи заключване на Ресурс 1, докато чака Процес 2 да освободи своето заключване на Ресурс 2. Ако Процес 2 държи заключване на Ресурс 2, докато чака Процес 1 да освободи Ресурс 1, ние имаме себе си блокиране на циклично заключване.

Как да диагностицираме застой на SQL Server

Застой на SQL Server е само една от десетките възможни причини, поради които приложението ви може да има проблеми с производителността. Ако заявките, които обикновено се изпълняват бързо, внезапно се забавят, възможно е да имате задънена улица. Но също така е възможно да се случи нещо друго.

И така, освен че забелязвате намалена скорост на заявка, как да определите със сигурност дали блокирането е виновно за проблемите с производителността на вашата база данни?

Най-лесният и категоричен начин за идентифициране на блокиране е наличието на съобщение за грешка 1205:

Транзакцията (ID на процес %d) беше блокирана на %.*ls ресурси с друг процес и беше избрана като жертва на безизходица. Изпълнете отново транзакцията.

Съобщението за грешка 1205 буквално ви казва, че има блокиране и как да го поправите. Въпреки това, както посочва Йеремия Пешка, ако не сте отстранили причината за задънената улица, повторното стартиране на транзакцията вероятно ще бъде неуспешно.

Друга възможност за намиране на застой е да издърпате графика за блокиране на SQL Server от разширени събития. Извличането на безизходица чрез разширени събития ви позволява да разгледате XML за блокиране, което предоставя повече информация от графичното представяне на графика за блокиране.

XML в застой е организиран от списъка с жертви, списъка с процеси и списъка с ресурси. Всеки раздел дава подробни описания на жертвите, процесите и ресурсите, включени в задънената улица, което улеснява отстраняването на неизправности и разрешаването на проблема.

Как да коригирам блокирането на SQL Server

Единственият начин за разрешаване на блокиране на SQL Server е да прекратите един от процесите и да освободите заключения ресурс, така че процесът да може да завърши. Това се случва автоматично, когато SQL Server открие застой и убие един от конкуриращите се процеси (т.е. жертвата).

SQL Server обикновено избира коя връзка да прекрати произволно, но е възможно да се зададат приоритети за блокиране, за да се определи коя връзка е убита по време на застой. Когато две връзки имат различни настройки за приоритет, SQL Server ще прекрати транзакцията с най-нисък приоритет.

Как да предотвратим застой на SQL Server

Застойът на SQL Server е факт от живота, когато управлявате натоварена база данни. Въпреки това, DBA могат да помогнат за намаляване на възникването на блокиране и минимизиране на тяхното въздействие върху производителността на базата данни, като предприемат няколко превантивни мерки:

  • Създайте по-добри индекси
  • Коригирайте приоритетите на транзакциите
  • Включете модел Опитай/Повторно
  • Промяна на режимите на изолация
  • Задръжте ключалки за възможно най-кратко време
  • Достъп до ресурси в един и същ ред всеки път
  • Не изпращайте транзакция, докато не разполагате с цялата необходима информация
  • Ескалация на заключване на ограничения

Въпреки че не е възможно да предотвратите напълно блокирането на SQL Server, можете да приложите тези най-добри практики и проактивно да заобиколите някои от най-често срещаните източници на блокиране, за да поддържате гладкото протичане на транзакциите и да оптимизирате производителността на базата данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да определим броя на дните в месеца в SQL Server?

  2. Обединение на SQL сървъри, но поддържайте реда

  3. SIN() Примери в SQL Server

  4. Проверете дали RPC Out е активиран на свързан сървър

  5. ISDATE() Примери в SQL Server