En SQL Server sys.dm_os_memory_cache_entries
, es posible ver tanto el costo original de una entrada en la memoria caché como el costo actual de la entrada de la memoria caché ( original_cost
y current_cost
respectivamente). El DMV sys.dm_os_buffer_descriptors
contiene un registro de las páginas que están actualmente en la memoria, así como algunos metadatos sobre las páginas. Una porción interesante de información no disponible en el DVM son los valores LRU-K para las páginas de datos.
¿Es posible obtener los valores de LRU-K para páginas de datos en el grupo de búferes en SQL Server? ¿Si es así, cómo?
sql-server
Jeremiah Peschka
fuente
fuente
Respuestas:
De hecho, no hay una forma útil de hacer esto hasta donde puedo ver.
La otra respuesta menciona
DBCC PAGE
y deja al lector que descifre los detalles. Por experimentación supongo que significanbUse1
.Esto no tiene en cuenta que
DBCC PAGE
es en sí un uso de la página y el valor se actualiza antes de que se nos muestre.A continuación se muestra un script que demuestra esto (tarda 12 segundos en ejecutarse).
Los resultados típicos son
Con el segundo resultado siendo
La salida después del retraso de 7 segundos se incrementa en 7 y después del retraso de 5 segundos en 5.
Por lo tanto, parece claro que estos valores de LRU son segundos desde alguna época. Reiniciar el servicio de SQL Server no altera la época, pero reiniciar la máquina sí.
El valor se transfiere cada 65.536 segundos, por lo que supongo que solo usa algo como
system_up_time mod 65536
Esto deja una pregunta sin respuesta en mi mente (¿hay personas que respondan?). SQL Server utiliza
LRU-K
deK=2
acuerdo con el libro interno. ¿No debería haber unbUse2
? Si es así, ¿dónde es eso?Sin
bUse1
embargo, sé que hay una manera de observar el valor sin cambiarlo y que Bob Ward lo demuestra aquí.Adjunte un depurador al proceso de SQL Server y muestre la memoria referenciada para la dirección de memoria de la estructura del búfer (que se muestra
0x00000002FE1F1440
arriba).Hice esto inmediatamente después de ejecutar el script anterior y vi lo siguiente.
(De la experimentación anterior, descubrí que los bytes resaltados fueron los únicos que cambiaron entre ejecuciones, por lo que estos son definitivamente los correctos).
Un aspecto sorprendente es que
SELECT CAST(0xc896 as int)
=51350
.Esto es exactamente 3600 (una hora) menos de lo informado por
DBCC PAGE
.Creo que esto es un intento de desfavorecer las páginas que se mantienen en caché llamándose a
DBCC PAGE
sí mismas. Para una página "normal", seleccione este ajuste de una hora. despues de correrEl valor que se muestra en la memoria es el esperado.
El
DBCC
comando realmente actualiza ese valor dos veces. Una vez enCon el valor más alto, nuevamente en
Con el inferior.
Sin embargo, no conozco ninguna forma de obtener direcciones de búfer para las páginas sin usar
DBCC BUFFER
/ deDBCC PAGE
ninguna manera y utilizando ambos cambios, ¡el valor que estamos tratando de inspeccionar!fuente
Como le mencioné al Sr. Peschka en Twitter, esta información se mantiene en la estructura BUF que guarda la página en la memoria. DBCC PAGE le brinda esta información como parte de su encabezado.
fuente
DBCC PAGE
es una forma terrible de encontrar algo, pero parece que estás en lo correcto. Es una pena que los datosDBCC PAGE
sean, efectivamente, galimatías y no se relacionen con ningún tiempo real del sistema.