AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 54377
Accepted
Jeremiah Peschka
Jeremiah Peschka
Asked: 2013-12-04 12:09:31 +0800 CST2013-12-04 12:09:31 +0800 CST 2013-12-04 12:09:31 +0800 CST

É possível visualizar os valores LRU-K no SQL Server?

  • 772

No SQL Server sys.dm_os_memory_cache_entriesé possível visualizar tanto o custo original de uma entrada no cache quanto o custo atual da entrada no cache ( original_coste current_costrespectivamente). O DMV sys.dm_os_buffer_descriptorscontém um registro das páginas que estão atualmente na memória, bem como alguns metadados sobre as páginas. Uma informação interessante não disponível 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? Em caso afirmativo, como?

sql-server
  • 2 2 respostas
  • 1060 Views

2 respostas

  • Voted
  1. Best Answer
    Martin Smith
    2013-12-26T13:42:33+08:002013-12-26T13:42:33+08:00

    Na verdade, não há uma maneira útil de fazer isso, até onde posso ver.

    A outra resposta menciona DBCC PAGEe deixa para o leitor descobrir os detalhes. Pela experimentação, presumo que eles signifiquem bUse1.

    Isso não leva em conta que DBCC PAGEé um 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).

    USE tempdb;
    
    CREATE TABLE T(X INT);
    
    INSERT INTO T VALUES(1);
    
    DECLARE @DBCCPAGE NVARCHAR(100);
    
    SELECT @DBCCPAGE = 'DBCC PAGE(0,' + CAST(file_id AS VARCHAR) + ',' + CAST(page_id AS VARCHAR) + ',0) WITH TABLERESULTS;'
    FROM   T CROSS APPLY  sys.fn_PhysLocCracker (%%physloc%%)
    
    DECLARE @DbccResults TABLE 
    (
          ID INT IDENTITY,
          ParentObject VARCHAR(1000)NULL,
          Object VARCHAR(4000)NULL,
          Field VARCHAR(1000)NULL,
          ObjectValue VARCHAR(MAX)NULL
    )    
    INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
    WAITFOR DELAY '00:00:07'
    INSERT INTO @DbccResults EXEC(@DBCCPAGE)  
    WAITFOR DELAY '00:00:05'
    INSERT INTO @DbccResults EXEC(@DBCCPAGE)             
    
    SELECT *
    FROM @DbccResults   
    WHERE Field = 'bUse1'    
    ORDER BY ID
    
    EXEC(@DBCCPAGE) 
    
    DROP TABLE T
    

    Os resultados típicos são

    +----+--------------+-------------------------+-------+-------------+
    | ID | ParentObject |         Object          | Field | ObjectValue |
    +----+--------------+-------------------------+-------+-------------+
    |  8 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54938 |
    | 49 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54945 |
    | 90 | BUFFER:      | BUF @0x00000002FE1F1440 | bUse1 |       54950 |
    +----+--------------+-------------------------+-------+-------------+
    

    Sendo o segundo resultado

    +---------+-------------------------+--------------+--------------------+
    | BUFFER: | BUF @0x00000002FE1F1440 | bpage        | 0x00000002F4968000 |
    | BUFFER: | BUF @0x00000002FE1F1440 | bhash        | 0x0000000000000000 |
    | BUFFER: | BUF @0x00000002FE1F1440 | bpageno      | (1:120)            |
    | BUFFER: | BUF @0x00000002FE1F1440 | bdbid        | 8                  |
    | BUFFER: | BUF @0x00000002FE1F1440 | breferences  | 0                  |
    | BUFFER: | BUF @0x00000002FE1F1440 | bcputicks    | 0                  |
    | BUFFER: | BUF @0x00000002FE1F1440 | bsampleCount | 0                  |
    | BUFFER: | BUF @0x00000002FE1F1440 | bUse1        | 54950              |
    | BUFFER: | BUF @0x00000002FE1F1440 | bstat        | 0x9                |
    | BUFFER: | BUF @0x00000002FE1F1440 | blog         | 0x1c9a             |
    | BUFFER: | BUF @0x00000002FE1F1440 | bnext        | 0x0000000000000000 |
    +---------+-------------------------+--------------+--------------------+
    

    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 do SQL Server não altera a época, mas reiniciar a máquina sim.

    O valor rola a cada 65.536 segundos, então presumo que use algo comosystem_up_time mod 65536

    Isso deixa uma pergunta sem resposta em minha mente (algum candidato?). O SQL Server usa LRU-Kcom K=2de acordo com o livro interno. Não deveria haver um bUse2? Se sim, onde é isso?

    Existe uma maneira de observar o bUse1valor sem alterá-lo que eu conheço e que é demonstrada 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 0x00000002FE1F1440acima).

    Fiz isso imediatamente após executar o script acima e vi o seguinte.

    insira a descrição da imagem aqui

    (Na experiência anterior, descobri 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) a menos do que o relatado por DBCC PAGE.

    Acredito que seja uma tentativa de desfavorecer as páginas mantidas em cache chamando a DBCC PAGEsi mesmo. Para uma página "normal", selecione este ajuste de uma hora não ocorre. Depois de correr

    SELECT *
    FROM T
    
    SELECT ((ms_ticks) % 65536000) / 1000 AS [Roughly Expected Value]
    FROM sys.dm_os_sys_info
    

    O valor mostrado na memória é o esperado.

    Na DBCCverdade, o comando atualiza esse valor duas vezes. Uma vez em

    sqlmin.dll!BPool::Touch()  + 0x3bfe bytes   
    sqlmin.dll!BPool::Get()  + 0x12e bytes  
    sqlmin.dll!LatchedBuf::ReadLatch()  + 0x14f bytes   
    sqlmin.dll!UtilDbccDumpPage()  + 0x364 bytes    
    sqlmin.dll!DbccPage()  + 0xfa bytes 
    sqllang.dll!DbccCommand::Execute()  + 0x153 bytes
    

    Com o valor mais alto, novamente em

    sqlmin.dll!LatchedBuf::FreeAndUnlatch()  + 0x71 bytes   
    sqlmin.dll!UtilDbccDumpPage()  + 0x545 bytes    
    sqlmin.dll!DbccPage()  + 0xfa bytes 
    sqllang.dll!DbccCommand::Execute()  + 0x153 bytes   
    

    Com o inferior.

    Não tenho conhecimento de nenhuma maneira de obter endereços de buffer para páginas sem usar DBCC BUFFER/ de DBCC PAGEqualquer maneira e usar essas duas alterações o valor que estamos tentando inspecionar!

    • 24
  2. DBArgenis
    2013-12-04T12:41:11+08:002013-12-04T12:41:11+08:00

    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. DBCC PAGE fornece essas informações como parte de seu cabeçalho.

    • 8

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve