igelr Asked: 2018-10-09 22:46:21 +0800 CST2018-10-09 22:46:21 +0800 CST 2018-10-09 22:46:21 +0800 CST 除了来自物理磁盘的页面之外,数据缓存还可以包含什么? 772 将statistics io选项设置为 ON 时,我看到了这个结果 physical_reads 为 0,read-ahead reads 为 276,这意味着磁盘驱动器上该表的 276 页在数据缓存中,但从数据缓存读取的总数为 794,如逻辑读取所示。那么除了来自磁盘驱动器的表页之外,数据缓存中还保存了什么? 谢谢。 sql-server cache 1 个回答 Voted Best Answer Shanky 2018-10-09T23:10:51+08:002018-10-09T23:10:51+08:00 这里有几件事所以让我解释一下 逻辑读取:每次数据库引擎从缓冲区缓存请求页面时都会发生逻辑读取。如果页面当前不在缓冲区缓存中,则物理读取首先将页面从磁盘复制到缓存中。 预读:我建议您阅读 SQL Server 中的阅读页面 数据库引擎支持称为预读的性能优化机制。预读预测完成查询执行计划所需的数据和索引页面,并在页面实际被查询使用之前将这些页面带入缓冲区缓存。这允许计算和 I/O 重叠,充分利用 CPU 和磁盘。 预读机制允许数据库引擎从一个文件中读取最多 64 个连续页 (512KB)。读取是作为对缓冲区高速缓存中适当数量(可能是非连续的)缓冲区的单个分散-收集读取执行的。如果该范围内的任何页面已存在于缓冲区缓存中,则读取完成时将丢弃读取的相应页面。如果相应的页面已经存在于缓存中,则页面范围也可以从任一端“修剪”。 现在回答你的问题 physical_reads 为 0,read-ahead reads 为 276,这意味着磁盘驱动器上该表的 276 页在数据缓存中, 不,这并不意味着只有276 页,它可以比 276 页多得多,实际上它总是比这更多。预读读取*超过所需的页面*并将这些页面放入内存这是为了性能优化而完成的,以确保所有页面都在缓存中并且可以避免物理I/O。单次读取最多可读取 64 页,这将被视为一次读取。来自旧 BOL 文档预读请求通常为每组 128 页,但在运行 Microsoft SQL Server Enterprise Edition 时可能多达 1,024 页。 从这篇旧的 Technet 文章中,企业版预读最多可达 1024 KB。 逻辑读取对单个页面进行计数,而预读对页面块进行计数。
这里有几件事所以让我解释一下
逻辑读取:每次数据库引擎从缓冲区缓存请求页面时都会发生逻辑读取。如果页面当前不在缓冲区缓存中,则物理读取首先将页面从磁盘复制到缓存中。
预读:我建议您阅读 SQL Server 中的阅读页面
现在回答你的问题
不,这并不意味着只有276 页,它可以比 276 页多得多,实际上它总是比这更多。预读读取*超过所需的页面*并将这些页面放入内存这是为了性能优化而完成的,以确保所有页面都在缓存中并且可以避免物理I/O。单次读取最多可读取 64 页,这将被视为一次读取。来自旧 BOL 文档预读请求通常为每组 128 页,但在运行 Microsoft SQL Server Enterprise Edition 时可能多达 1,024 页。
从这篇旧的 Technet 文章中,企业版预读最多可达 1024 KB。
逻辑读取对单个页面进行计数,而预读对页面块进行计数。