High PAGELATCH_ * i WRITELOG czeka. Czy są spokrewnieni?

11

Obserwujemy bardzo wysokie typy oczekiwania PAGELATCH_EX i PAGELATCH_SH oraz wysokie oczekiwania WRITELOG. Zdiagnozowałem zapytanie powodujące, że PAGELATCH czeka i mogę je wyeliminować, zmniejszając szybkość wstawiania do zajętego klucza podstawowego klastrowanego zdefiniowanego wartością TOŻSAMOŚĆ. Rozumiem, że to zjawisko jest znane jako rywalizacja o zatrzask wstawiania ostatniej strony.

Jednak moje pytanie brzmi: kiedy wstawiany jest nowy rekord, czy SQL Server pobiera wyłączny PAGELATCH_EX na stronie bufora, wstawia rekord na stronę bufora, zapisuje rekord w dzienniku transakcji, a następnie zwalnia wyłączny PAGELATCH_EX, jak opisano szczegółowo https: // www.microsoft.com/en-ie/download/details.aspx?id=26665 Strona 24. Czy zapisuje najpierw rekord w dzienniku transakcji przed pobraniem PAGELATCH_EX jako szczegółowe „Rozwiązywanie problemu PAGELATCH w sprawie wysoce współbieżnych” INSERT obciążeń - Informacje podstawowe Przewodnik SQLCAT: Relational Engine

Jeśli rekord zostanie zapisany w dzienniku poza mechanizmem zatrzasku, mogę wykluczyć powolne zapisywanie na dysk, ponieważ powoduje to wysokie oczekiwania PAGELATCH. Ale jeśli zatrzask zostanie przytrzymany, dopóki rekord nie zostanie zahartowany do rejestrowania, prawdopodobnie powinienem wziąć pod uwagę WRITELOG.

Czy także posiadanie wielu indeksów nieklastrowych spowodowałoby dłuższe utrzymywanie zatrzasku PAGELATCH_ *, tj. Jeśli tabela ma klastrowane i wiele indeksów nieklastrowych jest dodawanych i zwalnianych na każdej ze stron bufora indeksów jednocześnie?

Aktualizacja 1 Po przeczytaniu confio-sql-server-writelog-wait slajd dwa i ogólna architektura WAL. Rozumiem teraz, że krok „Zapisz wpis dziennika, że ​​wiersz został zmodyfikowany” szczegółowo opisany w obu oficjalnych dokumentach, odnosi się do SQL Server rejestrowania zmiany w pamięci podręcznej dziennika transakcji, a nie dysku. Po zakończeniu transakcji lub zapełnieniu bufora wszystkie rekordy są natychmiast opróżniane na dysk.

Piksele
źródło
1
Patrząc na problem bardzo podobny do tego w tej chwili ...
Dave Lawrence
Czy szukałeś potencjalnie wysokich VLF-ów powodujących problemy?
Kin Shah,
@Kin, co masz na myśli, mówiąc o powolnym opróżnianiu dziennika do dysku, trzymając otwartą zatrzask PAGELATCH_EX i powodując rywalizację o zatrzask?
Pixelated
Nie ma powodu, dla którego implementacja programu SQL Server musi generować rekord dziennika pod zatrzaskiem strony. Dlaczego mieliby to robić w ten sposób? Nieprawdopodobne. Ponadto, jeśli zapisy dziennika byłyby wykonywane pod łatką, prawie nigdy nie zobaczyłby się komunikat WRITELOG. Jednocześnie może być brany tylko jeden typ oczekiwania.
usr

Odpowiedzi:

1

Jednak moje pytanie brzmi: kiedy wstawiany jest nowy rekord, czy SQL Server pobiera wyłączny PAGELATCH_EX na stronie bufora, wstawia rekord na stronę bufora, zapisuje rekord w dzienniku transakcji, a następnie zwalnia wyłączny PAGELATCH_EX

Należy pamiętać, że zatrzask chroni tylko fizyczną integralność strony, gdy jest ona w pamięci, więc zatrzask zostanie wykonany, gdy strona będzie w pamięci. Załóżmy, że wstawiany jest rekord i należy pobrać tę stronę. Najpierw strona zostanie zablokowana i zapisana w pamięci, a następnie zatrzaśnięta i zapisana informacja. Po tym byłby proces

  • Wygeneruj rekord dziennika

  • Zaktualizuj stronę LSN, aby była zgodna z rekordem dziennika

  • Zmień dane (wyczyść stronę)

  • Zwolnij zatrzask

  • Rozpocznij transakcję od początku

  • FlushToLSN z Commit

  • Zwolnij blokady

  • Zatwierdź transakcję zakończoną

Aby uzyskać więcej informacji i wyjaśnień na temat powyższych kroków, przeczytaj blog prezentacji I / O Boba Dorra

Oczekiwanie na pagelatch * nie jest oczekiwaniem we / wy i widziałem, że większość czasu oczekiwania jest widoczna z powodu niezgodności alokacji. Mam przeczucie, że to ma coś wspólnego z tym, jak to zrobić tempdb is configured. Jak więc skonfigurowano tempdb? Ile plików danych tempdb jest obecnych? Upewnij się, że mają taki sam wzrost i rozmiar. Kiedy tworzona jest nowa strona, strony systemowe, takie jak GAM, SGAM i PFS, muszą zostać zaktualizowane lub są dostępne, a gdy SQL Server znajdzie rywalizację w dostępie do tych stron, poczekaj na obraz.

Shanky
źródło
Cześć @Shanky, na podstawie sys.dm_os_waiting_tasks.resource_description w połączeniu z DBCC PAGE i typem PAGELATCH_ * Wykluczyłem tempDB. Na podstawie łańcucha zdarzeń Boba Dorra wygląda na to, że krok „Generuj zapis dziennika” został zakończony w ramach mechanizmu zatrzaskowego?
Pixelated
3
Oba są wykluczającymi się wzajemnie zdarzeniami, w których zapis do pliku dziennika nie ma nic wspólnego z zatrzaśnięciem jego SQL Servera po protokole WAL do zapisywania informacji w logu przed faktycznym dokonaniem transakcji
Shanky