逻辑读取次数 8KB 超过实例内存

xhr*_*489 1 sql-server t-sql

我正在开发 SQL Server 实例并使用 Redgate SQL Monitor。我在前 10 个列表中看到一个执行了 1 次的查询,该查询的逻辑读取量比实例的内存多出约 100 倍,而且查询的持续时间只有几分钟。这怎么可能?我的意思是8KB页面乘以逻辑读取次数怎么会比内存多呢?我不明白是什么?

谢谢

Aar*_*and 5

如果 SQL Server 读取 10 个页面,则它们不必同时位于内存中。它还可以对同一页面的多次读取进行计数。

为简单起见,假设 SQL Server 将缓冲池限制为 8KB(方便地说是页的大小)。现在,您运行一个查询,要求 SQL Server 读取 3 页。它无法一次将所有页面装入内存,因此:

Action                    Number of reads so far
------------------------  ----------------------
Loads page 1 into memory                       1
Discards/disfavors page 1                      1
Loads page 2 into memory                       2
Discards/disfavors page 2                      2
Loads page 3 into memory                       3
Run Code Online (Sandbox Code Playgroud)

现在,假设您使用 CTE 或自连接或其他方式,如果 SQL Server 无法重用内存中的同一页面,则必须重新执行此操作。即使没有,如果它在内存中时必须访问同一页两次,那就是两次逻辑读取。如果查询计划中的运算符(如键查找)有 10 次执行,则这些是额外的逻辑读取。如果必须验证外键,还有更多。如果触发器作为事务的一部分运行,则涉及工作表,排序溢出到磁盘等,只需继续堆积读取即可。仅仅因为所有这些读取无法装入内存并不意味着它们仍然不必发生。

读取活动和最大服务器内存/缓冲池大小之间没有直接关联。您只需要记住,页面读取并不明显,并且它们不必全部发生在同一时刻,特别是如果您的缓冲池中有很多搅动,在这种情况下它们会分散开。