No SQL Server sys.dm_os_memory_cache_entries
, é possível visualizar o custo original de uma entrada no cache, bem como o custo atual da entrada no cache ( original_cost
e current_cost
respectivamente). A DMV sys.dm_os_buffer_descriptors
contém um registro das páginas que estão atualmente na memória, além de alguns metadados sobre as páginas. Uma parte interessante das informações não disponíveis no DVM são os valores LRU-K para as páginas de dados.
É possível obter os valores LRU-K para páginas de dados no buffer pool no SQL Server? Se sim, como?
sql-server
Jeremiah Peschka
fonte
fonte
Respostas:
De fato, não há maneira útil de fazer isso, tanto quanto eu possa ver.
A outra resposta menciona
DBCC PAGE
e deixa ao leitor descobrir os detalhes. Por experimentação, presumo que eles significambUse1
.Isso não leva em conta o
DBCC PAGE
uso da página e o valor é atualizado antes de ser mostrado para nós.Um script demonstrando isso está abaixo (leva 12 segundos para ser executado).
Resultados típicos são
Com o segundo resultado sendo
A saída após o atraso de 7 segundos é incrementada em 7 e após o atraso de 5 segundos em 5.
Portanto, parece claro que esses valores de LRU são segundos desde alguma época. Reiniciar o serviço SQL Server não altera a época, mas reiniciar a máquina.
O valor passa a cada 65.536 segundos, então presumo que ele use algo como
system_up_time mod 65536
Isso deixa uma pergunta sem resposta em minha mente (alguém que faz perguntas?). O SQL Server usa
LRU-K
com deK=2
acordo com o livro interno. Não deveria haver umbUse2
? Se sim, onde é isso?Há uma maneira de observar o
bUse1
valor sem alterá-lo que eu conheço e que é demonstrado por Bob Ward aqui.Anexe um depurador ao processo do SQL Server e exiba a memória referenciada para o endereço de memória da estrutura do buffer (mostrado
0x00000002FE1F1440
acima).Fiz isso imediatamente após executar o script acima e vi o seguinte.
(De experiências anteriores, eu achei que os bytes destacados eram os únicos que mudavam entre as execuções, então esses são definitivamente os corretos).
Um aspecto surpreendente é que
SELECT CAST(0xc896 as int)
=51350
.Isso é exatamente 3600 (uma hora) menos que o relatado por
DBCC PAGE
.Acredito que essa seja uma tentativa de desfavorecer as páginas mantidas em cache, chamando a
DBCC PAGE
si mesma. Para uma página "normal", selecione este ajuste de uma hora não ocorre. Depois de correrO valor mostrado na memória é como esperado.
O
DBCC
comando atualiza esse valor duas vezes. Uma vez emCom o valor mais alto, novamente em
Com o inferior.
Não conheço nenhuma maneira de obter endereços de buffer para páginas sem usar
DBCC BUFFER
/ deDBCC PAGE
nenhuma maneira e usar essas duas alterações no valor que estamos tentando inspecionar!fonte
Como mencionei ao Sr. Peschka no twitter, essas informações são mantidas na estrutura do BUF que mantém a página na memória. A página DBCC fornece essas informações como parte de seu cabeçalho.
fonte
DBCC PAGE
é uma maneira terrível de encontrar qualquer coisa, mas você parece estar correto. É uma pena que os dadosDBCC PAGE
sejam, efetivamente, sem sentido e não estejam relacionados a nenhum tempo real do sistema.