In SQL Server sys.dm_os_memory_cache_entries
ist es möglich , sowohl die ursprünglich Kosten für einen Eintrag im Cache sowie die aktuell Kosten für den Cache - Eintrag (zu betrachten original_cost
und current_cost
jeweils). Die DMV sys.dm_os_buffer_descriptors
enthält eine Aufzeichnung der aktuell im Speicher befindlichen Seiten sowie einige Metadaten zu den Seiten. Ein interessanter Informationsblock, der im DVM nicht verfügbar ist, sind die LRU-K-Werte für die Datenseiten.
Ist es möglich, die LRU-K-Werte für Datenseiten im Pufferpool in SQL Server abzurufen? Wenn das so ist, wie?
sql-server
Jeremiah Peschka
quelle
quelle
Antworten:
Es gibt in der Tat keine sinnvolle Möglichkeit, dies zu tun, soweit ich sehen kann.
Die andere Antwort erwähnt
DBCC PAGE
und überlässt es dem Leser, die Details herauszufinden. Vom Experimentieren gehe ich davon aus, dass sie bedeutenbUse1
.Dies berücksichtigt nicht, dass
DBCC PAGE
es sich um eine Nutzung der Seite handelt und der Wert aktualisiert wird, bevor er uns angezeigt wird.Ein Skript, das dies demonstriert, ist unten abgebildet (die Ausführung dauert 12 Sekunden).
Typische Ergebnisse sind
Mit dem zweiten Ergebnis ist
Die Ausgabe nach der Verzögerung von 7 Sekunden wird um 7 und nach der Verzögerung von 5 Sekunden um 5 erhöht.
Es scheint also klar zu sein, dass diese LRU-Werte seit einiger Zeit Sekunden sind. Durch einen Neustart des SQL Server-Dienstes wird die Epoche nicht geändert, durch einen Neustart des Computers jedoch.
Der Wert überschreitet sich alle 65.536 Sekunden, daher gehe ich davon aus, dass nur so etwas verwendet wird
system_up_time mod 65536
Dies lässt eine unbeantwortete Frage in meinem Kopf (irgendwelche Abnehmer?). SQL Server verwendet
LRU-K
mitK=2
laut internals Buch. Sollte es nicht eine gebenbUse2
? Wenn ja, wo ist das?Es gibt eine Möglichkeit, den
bUse1
Wert zu beobachten , ohne ihn zu ändern, von der ich jedoch weiß, und die wird hier von Bob Ward demonstriert .Hängen Sie einen Debugger an den SQL Server-Prozess an und zeigen Sie den referenzierten Speicher für die Speicheradresse der Pufferstruktur an (siehe Abbildung
0x00000002FE1F1440
oben).Ich habe das gleich nach dem Ausführen des obigen Skripts gemacht und Folgendes gesehen.
(Aus früheren Experimenten habe ich herausgefunden, dass die hervorgehobenen Bytes die einzigen waren, die sich zwischen den Läufen geändert haben, sodass dies definitiv die richtigen sind.)
Ein überraschender Aspekt ist, dass
SELECT CAST(0xc896 as int)
=51350
.Das sind genau 3600 (eine Stunde) weniger als von gemeldet
DBCC PAGE
.Ich glaube, dass dies ein Versuch ist, Seiten, die im Cache gehalten werden, durch einen Aufruf von sich
DBCC PAGE
selbst zu missbilligen . Für eine "normale" Seite wird diese einstündige Anpassung nicht durchgeführt. Nach dem RennenDer im Speicher angezeigte Wert ist wie erwartet.
Der
DBCC
Befehl aktualisiert diesen Wert tatsächlich zweimal. Einmal umMit dem höheren Wert dann nochmal um
Mit dem unteren.
Ich kenne keine Möglichkeit, Pufferadressen für Seiten abzurufen, ohne
DBCC BUFFER
/ inDBCC PAGE
irgendeiner Weise zu verwenden, und unter Verwendung dieser beiden Änderungen den Wert, den wir untersuchen möchten!quelle
Wie ich Herrn Peschka auf Twitter bereits sagte, werden diese Informationen in der BUF-Struktur gespeichert, in der die Seite gespeichert ist. DBCC PAGE gibt Ihnen diese Information als Teil seines Headers.
quelle
DBCC PAGE
ein schrecklicher Weg ist, etwas zu finden, aber Sie scheinen richtig zu sein. Es ist schade, dass die Daten vonDBCC PAGE
quasi Kauderwelsch sind und sich nicht auf eine reale Systemzeit beziehen.