Udostępnij za pośrednictwem


Operacje wyzwalające skanowanie puli buforów mogą działać wolno na komputerach z dużą pamięcią

W tym artykule opisano, jak skanowanie puli buforów SQL Server może zająć dużo czasu na komputerach z dużą pamięcią.

Dotyczy: SQL Server
Oryginalny numer KB: 4566579

Symptomy

Niektóre operacje w usłudze Microsoft SQL Server wyzwalają skanowanie puli buforów (pamięci podręcznej przechowującej strony bazy danych w pamięci). W systemach z dużą ilością pamięci RAM (1 TB pamięci lub większej) skanowanie puli buforów może zająć dużo czasu. Spowalnia to operację, która wyzwoliła skanowanie.

Operacje powodujące skanowanie puli buforów

Oto niektóre operacje, które mogą wyzwolić skanowanie puli buforów:

  • Uruchamianie bazy danych
  • Zamykanie lub ponowne uruchamianie bazy danych
  • Tryb failover grupy dostępności
  • Usuwanie bazy danych (upuszczanie)
  • Usuwanie pliku z bazy danych
  • Pełna lub różnicowa kopia zapasowa bazy danych
  • Przywracanie bazy danych
  • Przywracanie dziennika transakcji
  • Przywracanie online
  • DBCC CHECKDB lub DBCC CHECKTABLE operacja

Dziennik błędów pokazuje, że skanowanie trwało długo

Począwszy od SQL Server 2016 z dodatkiem SP3, SQL Server 2017 CU23 i SQL Server 2019 CU9, do dziennika błędów SQL Server dodano komunikat o błędzie wskazujący, że skanowanie puli buforów trwało długo (10 sekund lub dłużej):

Skanowanie puli buforów trwało 14 sekund: identyfikator bazy danych 7, polecenie "BACKUP DATABASE", operacja "FlushCache", przeskanowane bufory 115, łączna liczba buforów iteracyjnych 204640239, czas oczekiwania 0 ms. Aby uzyskać więcej informacji, zobacz "https://go.microsoft.com/fwlink/?linkid=2132602".

Zdarzenie rozszerzone w celu zdiagnozowania długiego skanowania

Ponadto, począwszy od tych samych kompilacji SQL Server 2016 SP3, SQL Server 2017 CU23 i SQL Server 2019 CU9 wprowadzono zdarzenie rozszerzone buffer_pool_scan_complete, aby ułatwić identyfikowanie długich skanów puli buforów.

Jeśli skanowanie trwa dłużej niż 1 sekundę, zdarzenie XEvent zostanie zarejestrowane w następujący sposób po włączeniu zdarzenia.

Nazwa Database_id elapsed_time_ms polecenie Operacji scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 KOPIA ZAPASOWA BAZY DANYCH FlushCache 243 19932814

Uwaga

Próg jest mniejszy, aby umożliwić przechwytywanie informacji o precyzyjniejszym stopniu szczegółowości.

Obejście problemu

Przed SQL Server 2022 r. nie było sposobu na wyeliminowanie tego problemu. Nie zaleca się wykonywania żadnych akcji w celu wyczyszczenia puli buforów, ponieważ usunięcie czystych buforów (DBCC DROPCLEANBUFFERS) z puli buforów może spowodować znaczne obniżenie wydajności. Usunięcie stron bazy danych z pamięci spowoduje ponowne odczytanie danych z plików bazy danych na dysku przez kolejne wykonania zapytań. Ten proces uzyskiwania dostępu do danych za pośrednictwem operacji we/wy dysku powoduje spowolnienie zapytań.

W SQL Server 2022 r. ten problem jest eligowany, ponieważ skany puli buforów są równoległe przy użyciu wielu rdzeni. Będzie jedno zadanie na 8 milionów buforów (64 GB), w którym będzie nadal używane skanowanie szeregowe, jeśli istnieje mniej niż 8 milionów buforów. Aby uzyskać więcej informacji, watch skanowanie równoległe puli buforów.

Więcej informacji

Aby uzyskać więcej informacji o problemach, które mogą wystąpić w dużych pulach buforów, zobacz SQL Server: duża pamięć RAM i punkt kontrolny bazy danych.