Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zmiany domyślnego poziomu izolacji serwera SQL

W twoim scenariuszu zalecałbym jawne ustawienie poziomu izolacji na migawkę - co zapobiegnie przeszkodzie w zapisie (wstawieniu i aktualizacji) poprzez zapobieganie blokadom, ale te odczyty nadal będą "dobrymi" odczytami (tj. nie będą brudnymi danymi - to nie to samo co NOLOCK)

Ogólnie uważam, że tam, gdzie mam problemy z blokowaniem moich zapytań, ręcznie kontroluję zastosowaną blokadę. np. zrobiłbym aktualizacje za pomocą blokad na poziomie wiersza, aby uniknąć blokowania na poziomie strony/tabeli, i ustaw moje odczyty na readpast (zakładając, że mogę pominąć niektóre dane, w niektórych scenariuszach może to być w porządku) link|edytuj|usuń|flaga

EDYTUJ-- Łączenie wszystkich komentarzy w odpowiedź

Jako część procesu optymalizacji, serwer sql unika uzyskiwania zatwierdzonych odczytów na stronie, o której wie, że nie uległa zmianie, i automatycznie powraca do mniejszej strategii blokowania. W twoim przypadku serwer sql spada z odczytu serializowanego do odczytu powtarzalnego.

P:Dziękuję za te przydatne informacje dotyczące zrzucania poziomów izolacji. Czy możesz podać jakikolwiek powód, dla którego w pierwszej kolejności użyłby Serializable IsolationLevel, biorąc pod uwagę, że nie używamy jawnej transakcji dla SELECT - to było nasze zrozumienie, że niejawna transakcja użyje ReadCommitted?

O:Domyślnie SQL Server użyje Read Commmitted, jeśli jest to twój domyślny poziom izolacji, ALE jeśli nie określisz dodatkowo strategii blokowania w zapytaniu, zasadniczo mówisz serwerowi sql „rób to, co uważasz za najlepsze, ale moje preferencje jest odczytany". Ponieważ SQL Server jest wolny do wyboru, robi to w celu optymalizacji zapytania. (Algorytm optymalizacji w serwerze sql jest bardzo złożony i sam go do końca nie rozumiem). Niewykonywanie jawnie w ramach transakcji nie wpływa na poziom izolacji używany przez serwer sql.

P:I ostatnia rzecz, czy wydaje się rozsądne, że SQL Server zwiększy poziom izolacji (i przypuszczalnie liczbę wymaganych blokad) w celu zoptymalizowania zapytania? Zastanawiam się również, czy ponowne użycie połączenia w puli miałoby na to wpływ, gdyby odziedziczyło ostatnio używany poziom izolacji?

A:Serwer Sql zrobi to w ramach procesu o nazwie "Lock Escalation". Z http://support.microsoft.com/kb/323630 , cytuję:"Microsoft SQL Server dynamicznie określa, kiedy wykonać eskalację blokad. Podejmując tę ​​decyzję, SQL Server bierze pod uwagę liczbę blokad utrzymywanych na danym skanie, liczbę blokad utrzymywanych przez całą transakcję, i pamięć, która jest używana do blokad w systemie jako całości.Zazwyczaj domyślne zachowanie SQL Server powoduje eskalację blokad występującą tylko w tych punktach, w których poprawiłoby to wydajność lub gdy trzeba zredukować nadmierną ilość pamięci blokad systemu do bardziej rozsądnego poziomu .Jednak niektóre projekty aplikacji lub zapytań mogą wyzwalać eskalację blokady w czasie, gdy nie jest to pożądane, a eskalowana blokada tabeli może blokować innych użytkowników”.

Chociaż eskalacja blokad nie jest dokładnie tym samym, co zmiana poziomu izolacji, na którym działa zapytanie, jest to dla mnie zaskoczeniem, ponieważ nie spodziewałbym się, że serwer sql będzie przyjmował więcej blokad, niż pozwala na to domyślny poziom izolacji.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj według zapytania sql w kolumnie połączonej przecinkami

  2. Zapytanie o aktualizację na milionach wierszy wypełnia dziennik transakcji

  3. zapytanie ms sql dotyczące liczby wystąpień słów w kolumnie tekstowej

  4. Dynamiczny SQL (przekazywanie nazwy tabeli jako parametru)

  5. jak używać właściwości msbuild w skrypcie sqlproj (SQL Server 2012)