我正在开发 SQL Server 实例并使用 Redgate SQL Monitor。我在前 10 个列表中看到一个执行了 1 次的查询,该查询的逻辑读取量比实例的内存多出约 100 倍,而且查询的持续时间只有几分钟。这怎么可能?我的意思是8KB页面乘以逻辑读取次数怎么会比内存多呢?我不明白是什么?
谢谢
如果 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 次执行,则这些是额外的逻辑读取。如果必须验证外键,还有更多。如果触发器作为事务的一部分运行,则涉及工作表,排序溢出到磁盘等,只需继续堆积读取即可。仅仅因为所有这些读取无法装入内存并不意味着它们仍然不必发生。
读取活动和最大服务器内存/缓冲池大小之间没有直接关联。您只需要记住,页面读取并不明显,并且它们不必全部发生在同一时刻,特别是如果您的缓冲池中有很多搅动,在这种情况下它们会分散开。