„Eskalacja blokady " to sposób, w jaki SQL obsługuje blokowanie dużych aktualizacji. Gdy SQL ma zmienić wiele wierszy, bardziej wydajne jest, aby silnik bazy danych wykonał mniej, większych blokad (np. całej tabeli) zamiast blokować wiele mniejszych elementów (np. blokad wierszy)
Ale może to być problematyczne, gdy masz dużą tabelę, ponieważ zablokowanie całej tabeli może zablokować inne zapytania na długi czas. To jest kompromis:wiele blokad o małej ziarnistości jest wolniejszych niż mniej (lub jedna) gruboziarnistych blokad, a posiadanie wielu zapytań blokujących różne części tabeli stwarza możliwość zakleszczenia, jeśli jeden proces czeka na inny.
Istnieje opcja na poziomie tabeli, LOCK_ESCALATION
, nowość w SQL 2008, która umożliwia kontrolę eskalacji blokad. Domyślna wartość „TABLE” umożliwia eskalację blokad aż do poziomu tabeli. DISABLE zapobiega w większości przypadków eskalacji blokady na cały stół. AUTO umożliwia blokowanie tabeli, z wyjątkiem sytuacji, gdy tabela jest podzielona na partycje, w którym to przypadku blokady są wykonywane tylko do poziomu partycji. Zobacz ten post na blogu aby uzyskać więcej informacji.
Podejrzewam, że IDE dodaje to ustawienie podczas ponownego tworzenia tabeli, ponieważ TABLE jest wartością domyślną w SQL 2008. Zauważ, że LOCK_ESCALATION nie jest obsługiwany w SQL 2005, więc będziesz musiał je usunąć, jeśli próbujesz uruchomić skrypt na 2005 instancja. Ponadto, ponieważ TABLE jest wartością domyślną, możesz bezpiecznie usunąć tę linię podczas ponownego uruchamiania skryptu.
Należy również zauważyć, że w SQL 2005, zanim to ustawienie było obecne, wszystkie blokady mogły zostać eskalowane do poziomu tabeli — innymi słowy, „TABLE” było jedynym ustawieniem w SQL 2005.