Query Store ma limit przestrzeni i liczby przechowywanych planów — po ich wyczerpaniu przechodzi w tryb tylko do odczytu.
Jak działa limit przestrzeni w Query Store
Query Store w Microsoft SQL Server zapisuje historię zapytań, ich tekstów, planów wykonania oraz zagregowanych statystyk wykonania. Dane są przechowywane w bazie użytkownika, a nie w osobnym repozytorium administracyjnym. Konfiguracja mechanizmu obejmuje między innymi maksymalny rozmiar magazynu określany opcją MAX_STORAGE_SIZE_MB. Limit ten dotyczy przestrzeni przydzielonej na dane Query Store i powinien być oceniany razem z rozmiarem bazy, częstotliwością wykonywania zapytań oraz wybranym trybem przechwytywania.
Po zbliżeniu się do limitu SQL Server może usuwać najstarsze dane, jeżeli włączony jest tryb czyszczenia zależny od rozmiaru, czyli SIZE_BASED_CLEANUP_MODE = AUTO. Czyszczenie ogranicza zajętość magazynu, ale nie oznacza nieograniczonego przechowywania historii. Usunięte statystyki runtime, teksty zapytań albo plany nie mogą być później wykorzystane do analizy okresu, który został objęty czyszczeniem. Jeżeli dostępna przestrzeń nadal jest niewystarczająca lub wystąpi przyczyna uniemożliwiająca zapis, Query Store może przejść do stanu tylko do odczytu.
Tryb READ_ONLY i jego skutki
W stanie READ_ONLY Query Store zachowuje możliwość odczytu wcześniej zapisanych informacji, lecz nie przyjmuje nowych danych zgodnie z normalnym mechanizmem przechwytywania. Oznacza to, że widoki katalogowe Query Store mogą nadal zwracać historyczne plany i statystyki, ale obraz obciążenia przestaje się aktualizować. W efekcie analiza może sugerować, że określone zapytanie nadal ma ten sam czas wykonania lub ten sam plan, choć bieżące wykonania nie są już dopisywane do historii.
Sam fakt wystąpienia stanu tylko do odczytu nie wskazuje jeszcze, że przyczyną był wyłącznie pełny magazyn. SQL Server udostępnia w widoku sys.database_query_store_options między innymi kolumny actual_state_desc, desired_state_desc i readonly_reason. actual_state_desc pokazuje rzeczywisty stan mechanizmu, natomiast desired_state_desc wskazuje stan skonfigurowany dla bazy. Różnica między tymi wartościami jest istotna diagnostycznie: Query Store może być skonfigurowany jako włączony, ale chwilowo działać w stanie ograniczonym przez problem z zapisem, przestrzenią albo innym warunkiem wewnętrznym.
Limit liczby planów dla jednego zapytania
Ograniczenie Query Store nie dotyczy tylko całkowitej wielkości magazynu. SQL Server kontroluje również liczbę planów przechowywanych dla pojedynczego zapytania. Służy do tego opcja MAX_PLANS_PER_QUERY. Ma ona znaczenie w środowiskach, w których to samo zapytanie otrzymuje wiele różnych planów wskutek zmiennych wartości parametrów, zmian indeksów, aktualizacji statystyk, zmian schematu lub modyfikacji ustawień optymalizatora.
Osiągnięcie limitu planów dla konkretnego zapytania nie oznacza automatycznie wyłączenia całego Query Store. Jest to ograniczenie lokalne dla danego identyfikatora zapytania i wpływa na to, ile jego planów może zostać zarejestrowanych. Jeżeli limit zostanie ustawiony zbyt nisko, historia może nie pokazać pełnej zmienności planów. Jeżeli zostanie ustawiony zbyt wysoko, pojedyncze zapytanie może zużywać nieproporcjonalną część dostępnej przestrzeni, szczególnie gdy przechowywane są liczne warianty planów i statystyki runtime. Dlatego interpretacja problemu wymaga rozróżnienia między limitem całego magazynu a limitem planów jednego zapytania.
Sprawdzanie stanu i bezpieczne przywracanie zapisu
Podstawową kontrolę można wykonać przez odczyt konfiguracji z sys.database_query_store_options. Warto sprawdzić bieżący i maksymalny rozmiar magazynu, stan Query Store, powód stanu tylko do odczytu, tryb czyszczenia zależny od rozmiaru oraz tryb przechwytywania zapytań. Przydatne są pola takie jak current_storage_size_mb, max_storage_size_mb, actual_state_desc, readonly_reason i query_capture_mode_desc. Samo zwiększenie limitu nie rozwiązuje problemu, jeżeli przyczyną jest brak miejsca na woluminie, błąd zapisu lub ograniczenie zasobów.
Po ustaleniu przyczyny można skorygować ustawienia Query Store poleceniem ALTER DATABASE, używając opcji właściwych dla konkretnej bazy, na przykład MAX_STORAGE_SIZE_MB albo SIZE_BASED_CLEANUP_MODE. Przed zmianą należy ocenić dostępne miejsce, oczekiwaną retencję historii i koszt przechowywania wielu planów. Zbyt agresywne czyszczenie usuwa materiał potrzebny do porównań regresji, natomiast brak kontroli nad rozmiarem może ponownie doprowadzić do zatrzymania zapisu. W przypadku diagnostyki komputera, na którym działa narzędzie klienckie, trzeba dodatkowo oddzielić problem programu klienckiego od stanu Query Store w instancji SQL Server; komunikat o braku nowych danych nie jest sam w sobie dowodem awarii sprzętu.