在 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 中sys.dm_os_memory_cache_entries
,可以查看缓存中条目的原始成本以及缓存条目的当前成本(分别为original_cost
和current_cost
)。DMVsys.dm_os_buffer_descriptors
包含当前内存中页面的记录以及有关页面的一些元数据。DVM 中不可用的一个有趣的信息块是数据页的 LRU-K 值。
是否可以在 SQL Server 的缓冲池中获取数据页的 LRU-K 值?如果是这样,如何?
据我所知,实际上没有任何有用的方法可以做到这一点。
另一个答案提到
DBCC PAGE
并留给读者去弄清楚细节。从实验我假设他们的意思bUse1
。这没有考虑到它
DBCC PAGE
本身就是对页面的使用,并且该值在显示给我们之前会得到更新。下面是演示这一点的脚本(运行需要 12 秒)。
典型的结果是
第二个结果是
7 秒延迟后的输出增加 7,5 秒延迟后增加 5。
所以很明显,这些 LRU 值是自某个纪元以来的秒数。重新启动 SQL Server 服务不会改变纪元,但重新启动机器会。
该值每 65,536 秒翻转一次,所以我认为它只是使用类似
system_up_time mod 65536
这确实在我脑海中留下了一个悬而未决的问题(有人接受吗?)。SQL Server根据内部手册使用
LRU-K
with 。K=2
不应该有一个bUse2
吗?如果有,那是哪里?bUse1
我知道有一种在不改变价值的情况下观察价值的方法,鲍勃·沃德 (Bob Ward)在这里对此进行了演示。将调试器附加到 SQL Server 进程并显示缓冲区结构的内存地址的引用内存(如上所示
0x00000002FE1F1440
)。我在运行上面的脚本后立即执行了此操作并看到了以下内容。
(根据之前的实验,我发现突出显示的字节是唯一在运行之间发生变化的字节,因此这些字节绝对是正确的)。
一个令人惊讶的方面是
SELECT CAST(0xc896 as int)
=51350
。这比 报告的时间少了整整 3600(一小时)
DBCC PAGE
。DBCC PAGE
我相信这是一些不喜欢通过调用自身来保存在缓存中的页面的尝试。对于“正常”页面选择,这一小时的调整不会发生。运行后内存中显示的值符合预期。
该
DBCC
命令实际上将该值更新了两次。具有更高的价值然后再次在
与较低的。
我不知道有什么方法可以在不使用
DBCC BUFFER
/DBCC PAGE
任何方式的情况下获取页面的缓冲区地址,并且使用这两种方法都会改变我们试图检查的值!正如我在推特上对 Peschka 先生提到的那样,此信息保存在内存中保存页面的 BUF 结构中。DBCC PAGE 将此信息作为其标题的一部分提供给您。