AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 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

是否可以在 SQL Server 中查看 LRU-K 值?

  • 772

在 SQL Server 中sys.dm_os_memory_cache_entries,可以查看缓存中条目的原始成本以及缓存条目的当前成本(分别为original_cost和current_cost)。DMVsys.dm_os_buffer_descriptors包含当前内存中页面的记录以及有关页面的一些元数据。DVM 中不可用的一个有趣的信息块是数据页的 LRU-K 值。

是否可以在 SQL Server 的缓冲池中获取数据页的 LRU-K 值?如果是这样,如何?

sql-server
  • 2 2 个回答
  • 1060 Views

2 个回答

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

    据我所知,实际上没有任何有用的方法可以做到这一点。

    另一个答案提到DBCC PAGE并留给读者去弄清楚细节。从实验我假设他们的意思bUse1。

    这没有考虑到它DBCC PAGE本身就是对页面的使用,并且该值在显示给我们之前会得到更新。

    下面是演示这一点的脚本(运行需要 12 秒)。

    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
    

    典型的结果是

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

    第二个结果是

    +---------+-------------------------+--------------+--------------------+
    | 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 |
    +---------+-------------------------+--------------+--------------------+
    

    7 秒延迟后的输出增加 7,5 秒延迟后增加 5。

    所以很明显,这些 LRU 值是自某个纪元以来的秒数。重新启动 SQL Server 服务不会改变纪元,但重新启动机器会。

    该值每 65,536 秒翻转一次,所以我认为它只是使用类似system_up_time mod 65536

    这确实在我脑海中留下了一个悬而未决的问题(有人接受吗?)。SQL Server根据内部手册使用LRU-Kwith 。K=2不应该有一个bUse2吗?如果有,那是哪里?

    bUse1我知道有一种在不改变价值的情况下观察价值的方法,鲍勃·沃德 (Bob Ward)在这里对此进行了演示。

    将调试器附加到 SQL Server 进程并显示缓冲区结构的内存地址的引用内存(如上所示0x00000002FE1F1440)。

    我在运行上面的脚本后立即执行了此操作并看到了以下内容。

    在此处输入图像描述

    (根据之前的实验,我发现突出显示的字节是唯一在运行之间发生变化的字节,因此这些字节绝对是正确的)。

    一个令人惊讶的方面是SELECT CAST(0xc896 as int)= 51350。

    这比 报告的时间少了整整 3600(一小时)DBCC PAGE。

    DBCC PAGE我相信这是一些不喜欢通过调用自身来保存在缓存中的页面的尝试。对于“正常”页面选择,这一小时的调整不会发生。运行后

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

    内存中显示的值符合预期。

    该DBCC命令实际上将该值更新了两次。

    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
    

    具有更高的价值然后再次在

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

    与较低的。

    我不知道有什么方法可以在不使用DBCC BUFFER/DBCC PAGE任何方式的情况下获取页面的缓冲区地址,并且使用这两种方法都会改变我们试图检查的值!

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

    正如我在推特上对 Peschka 先生提到的那样,此信息保存在内存中保存页面的 BUF 结构中。DBCC PAGE 将此信息作为其标题的一部分提供给您。

    • 8

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve