Różnica między poziomem wiersza a blokowaniem na poziomie strony i konsekwencjami

10

Podczas próby uruchomienia mojego planu konserwacji pojawia się następujący błąd:

Wykonanie zapytania „” nie powiodło się z następującym błędem: „Nie można zreorganizować indeksu” (partycja 1) w tabeli „”, ponieważ blokowanie na poziomie strony jest wyłączone. ”

Obecnie w tym indeksie włączono blokowanie na poziomie wiersza. Mogę włączyć blokowanie na poziomie strony, ale nie jestem pewien, jakie są tego konsekwencje.

Moje pytanie brzmi : jaka jest różnica między tymi dwoma schematami blokowania i jakie są ich konsekwencje w świecie rzeczywistym (w produkcji)?

Cebulowy rycerz
źródło

Odpowiedzi:

14

Wykonanie zapytania „” nie powiodło się z następującym błędem: „Nie można zreorganizować indeksu” (partycja 1) w tabeli „”, ponieważ blokowanie na poziomie strony jest wyłączone. ”

W planie konserwacji musi być podjęta próba ZMIANA REORGANIZACJI INDEKSU, która jest operacją online. Aby usunąć fragmentację (strony nie w kolejności), strony muszą zostać zablokowane i przeniesione, co nie jest możliwe, jeśli blokady stron zostały wyłączone. Jedynym sposobem na defragmentację bez blokad strony jest zablokowanie całej partycji, co nie jest możliwe dla REORGANIZE jako tylko online.

Jaka jest różnica między tymi dwoma schematami blokowania i jakie są ich konsekwencje w świecie rzeczywistym (w produkcji)?

Musisz zrozumieć, jaki jest rekord i strona, aby ocenić wpływ niedozwolenia na określony typ blokady. Jeśli nie znasz wewnętrznych elementów pamięci SQL Server, zacznij od Anatomia rekordu i Anatomia strony . Mówiąc bardzo prosto:

  • wiersze = rekordy
  • wiersze są przechowywane na stronach o wielkości 8 KB

Jeśli chcesz zmienić dozwolone typy zamków:

  • Wyłącz blokady stron = tylko blokady wierszy i tabel
  • Wyłącz blokady wierszy = Tylko blokady stron i tabel
  • Wyłącz oba = Tylko blokady tabeli

Istnieją dwa scenariusze, w których zdaję sobie sprawę z tego, że może być korzystne wyłączenie typu blokady. Nie oznacza to, że nie ma innych, mam nadzieję, że ktoś inny wkroczy z przykładami.

Często przeglądana tabela odnośników, która rzadko się zmienia - Wyłączając blokady na poziomie strony i wiersza, wszyscy czytelnicy przyjmą blokadę wspólnej tabeli. Jest to szybsze / tańsze niż zwykłe udostępnianie intencyjne w tabeli, następnie zamierzone udostępnianie na stronie i wreszcie wspólna blokada w określonym wierszu lub wierszach.

Zapobieganie konkretnemu scenariuszowi zakleszczenia - w przypadku wystąpienia zakleszczeń spowodowanych jednoczesnymi procesami pozyskiwania blokad, które często znajdują się na tej samej stronie, wyłączenie blokad wierszy powoduje, że zamiast nich zostaną podjęte blokady stron. Tylko jeden proces może uzyskać dostęp do strony jednocześnie, drugi musi czekać.

Pierwszy przykład to mikrooptymalizacja i jest mało prawdopodobne, aby przyniosła wymierne korzyści w typowym systemie. Drugi rozwiąże ten konkretny scenariusz impasu, ale może wprowadzić nieoczekiwane skutki uboczne, np. Zabijanie współbieżności w innej sekcji kodu. Trudno jest w pełni ocenić wpływ, należy zachować ostrożność!

Domyślnie oba są włączone i nie należy tego zmieniać bez ważnej przyczyny.

Mark Storey-Smith
źródło
9

Prawdopodobnie nic. Jestem pewien, że stwardnienie rozsiane wie lepiej niż ty lub ja

Pracowałem na dużych systemach OLTP i nigdy nie czułem potrzeby zmiany ustawień. Zakleszczenie należy ponowić, ponieważ i tak się zdarzy

Cytowanie z bloga SQL Server Storage Engine „Zablokuj eskalację w SQL2005”, które i tak warto przeczytać całkowicie.

Domyślnie mamy włączoną blokadę ROW i PAGE ... SQL Server wybiera ziarnistość blokady ROW w większości przypadków, ale może wybrać blokadę PAGE w stosownych przypadkach. Tak więc dla podanego przypadku prawdopodobna jest blokada ROW. Nie ma możliwości wyłączenia blokowania PAGE na poziomie bazy danych lub instancji. Czy napotykasz blokowanie spowodowane blokadami PAGE?

Sądzę, że jeśli tylko wymusisz rowlocks, zużyjesz zasoby, które można by efektywniej wykorzystać gdzie indziej. Jeśli twoje obciążenie jest na tyle duże, że ma to znaczenie, to po co zużywać pamięć? Artykuł na blogu wchodzi w to

Podejrzewam, że kryje się za tym przesąd, podobnie jak te:

gbn
źródło
+1, ale: można zapobiec zakleszczeniom w systemach OLTP; mój system działa bez blokady przez wiele miesięcy, chociaż wdrażamy 2-3 razy w tygodniu.
AK