2009-11-09 8 views
110

Podczas zmiany tabeli (usuwania kolumny) w SQL Server 2008, kliknąłem przycisk Generuj skrypt zmiany i zauważyłem, że wygenerowany przez nią skrypt zmiany upuszcza kolumnę, mówi "go", a następnie uruchamia dodatkową instrukcję ALTER TABLE, która pojawia się aby ustawić eskalację blokady dla tabeli na "TABLE". Przykład:Lock Escalation - Co się tutaj dzieje?

ALTER TABLE dbo.Contract SET (LOCK_ESCALATION = TABLE) 

Należy również zauważyć, że jest to ostatnia rzecz, którą robi skrypt zmiany. Co tu robi i dlaczego ustawia LOCK_ESCALATION na TABLE?

Odpowiedz

141

"Lock Escalation" to sposób, w jaki SQL obsługuje blokowanie dużych aktualizacji. Kiedy SQL ma zamiar zmienić wiele wierszy, wydajniejsze jest, aby silnik bazy danych używał mniejszych, większych blokad (np. Całej tabeli) zamiast blokować wiele mniejszych rzeczy (np. Blokad wierszy).

Ale może to być problematyczne, gdy masz duży stół, ponieważ zablokowanie całej tabeli może blokować inne zapytania przez długi czas. To kompromis: wiele blokad o małej ziarnistości jest wolniejszych od mniejszej (lub jednej) gruboziarnistej blokady, a posiadanie wielu zapytań blokujących różne części stołu stwarza możliwość zakleszczenia, jeśli jeden proces czeka na inny.

Istnieje opcja na poziomie tabeli, LOCK_ESCALATION, nowa w SQL 2008, która pozwala kontrolować eskalację blokady. Wartość domyślna "TABELA" pozwala eskalować blokady do poziomu stołu. DISABLE zapobiega w większości przypadków eskalacji blokady do całego stołu. AUTO zezwala na blokadę stołu, chyba że tabela jest podzielona na partycje, w takim przypadku blokady są tworzone tylko do poziomu partycji. Aby uzyskać więcej informacji, patrz this blog post.

Podejrzewam, że IDE dodaje to ustawienie podczas ponownego tworzenia tabeli, ponieważ TABELA jest domyślna w SQL 2008. Zauważ, że LOCK_ESCALATION nie jest obsługiwany w SQL 2005, więc musisz usunąć go, jeśli próbuje uruchomić skrypt w instancji z 2005 r. Ponadto, ponieważ TABLE jest wartością domyślną, możesz bezpiecznie usunąć tę linię po ponownym uruchomieniu skryptu.

Należy również pamiętać, że w SQL 2005, zanim ta opcja była obecna, wszystkie zamki mogłyby przerodzić się w tabeli level-- Innymi słowy, „TABLE” był tylko ustawienie na SQL 2005.

+1

Powielony post na forach MSDN: http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/e96aa19e-d72c-46af-b2e8-4bf54de09440 –

+0

@JustinGrant: Czy to wyrażenie być połączone z instrukcją "CREATE TABLE"? –

+6

@dma_k - Ta opcja nie jest odpowiednia dla 'CREATE TABLE', ponieważ tabela jeszcze nie istnieje, więc nie ma nic do zablokowania. –

6

Można sprawdzić, czy muszą zawierać oświadczenie LOCK_ESCALATION w skrypcie przez porównanie tej wartości przed i po uruchomieniu główną część skryptu:

SELECT lock_escalation_desc FROM sys.tables WHERE name='yourtablename' 

w moim przypadku, zmieniając stół do spadku lub dodać ograniczenie nie wydaje się, aby zmodyfikować ten wartość.

Powiązane problemy