W SQL Server sys.dm_os_memory_cache_entries
można wyświetlić zarówno oryginalny koszt wpisu w pamięci podręcznej, jak i bieżący koszt wpisu w pamięci podręcznej ( original_cost
i current_cost
odpowiednio). DMV sys.dm_os_buffer_descriptors
zawiera zapis stron, które są obecnie w pamięci, a także niektóre metadane dotyczące stron. Jednym z interesujących fragmentów informacji niedostępnych w DVM są wartości LRU-K dla stron danych.
Czy można uzyskać wartości LRU-K dla stron danych w puli buforów w SQL Server? Jeśli tak to jak?
sql-server
Jeremiasz Peschka
źródło
źródło
Odpowiedzi:
Tak naprawdę, jak widzę, nie ma użytecznego sposobu na zrobienie tego.
Druga odpowiedź wspomina
DBCC PAGE
i pozostawia czytelnikowi ustalenie szczegółów. Z eksperymentów zakładam, że mają na myślibUse1
.Nie bierze się pod uwagę, że
DBCC PAGE
samo jest to użytkowanie strony, a wartość jest aktualizowana, zanim zostanie nam pokazana.Skrypt demonstrujący to jest poniżej (uruchomienie zajmuje 12 sekund).
Typowe wyniki to
Z drugim rezultatem
Wyjście po 7-sekundowym opóźnieniu jest zwiększane o 7, a po 5-sekundowym opóźnieniu o 5.
Wydaje się więc jasne, że te wartości LRU to sekundy od pewnej epoki. Ponowne uruchomienie usługi SQL Server nie zmienia epoki, ale powoduje to ponowne uruchomienie komputera.
Wartość zmienia się co 65 536 sekund, więc zakładam, że po prostu używa czegoś takiego
system_up_time mod 65536
Pozostawia to w pamięci jedno pytanie bez odpowiedzi (któryś z uczestników?). SQL Server używa
LRU-K
sięK=2
według książki wewnętrzne. Czy nie powinno byćbUse2
? Jeśli tak to gdzie to jest?Jest jeden sposób na obserwowanie
bUse1
wartości bez jej zmiany, o którym wiem, o czym świadczy tutaj Bob Ward .Dołącz debugger do procesu SQL Server i wyświetl pamięć odniesienia dla adresu pamięci struktury bufora (pokazano
0x00000002FE1F1440
powyżej).Zrobiłem to natychmiast po uruchomieniu powyższego skryptu i zobaczyłem następujące.
(Z wcześniejszych eksperymentów odkryłem, że wyróżnione bajty były jedynymi, które zmieniły się między przebiegami, więc są zdecydowanie właściwe).
Jednym zaskakującym aspektem jest to, że
SELECT CAST(0xc896 as int)
=51350
.To dokładnie 3600 (jedna godzina) mniej niż zgłaszane przez
DBCC PAGE
.Uważam, że jest to próba zniechęcenia stron do przechowywania w pamięci podręcznej przez wywołanie
DBCC PAGE
siebie. W przypadku strony „normalnej” wybierz tę jednogodzinną regulację. Po bieganiuWartość wyświetlana w pamięci jest zgodna z oczekiwaniami.
DBCC
Komenda faktycznie aktualizuje tę wartość dwukrotnie. Raz oZ wyższą wartością to ponownie przy
Z dolnym.
Nie znam żadnego sposobu na uzyskanie adresów buforów dla stron bez użycia
DBCC BUFFER
/DBCC PAGE
żadnego sposobu i przy użyciu obu tych zmian wartość, którą próbujemy sprawdzić!źródło
Jak wspomniałem panu Peschce na Twitterze, ta informacja jest przechowywana w strukturze BUF, która utrzymuje stronę w pamięci. DBCC PAGE podaje tę informację jako część jej nagłówka.
źródło
DBCC PAGE
to okropny sposób na znalezienie czegokolwiek, ale wydaje się, że masz rację. Szkoda, że dane z tegoDBCC PAGE
są faktycznie bełkotliwe i nie odnoszą się do żadnego rzeczywistego czasu systemowego.