• SQL Server 中的逻辑读与物理读


    首先要理解逻辑读和物理读:

    •   预读:用估计信息,去硬盘读取数据到缓存。预读100次,也就是估计将要从硬盘中读取了100页数据到缓存。
    •   物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘。物理读10页,从硬盘中读取10页数据到缓存。
    •   逻辑读:从缓存中取出所有数据。逻辑读100次,也就是从缓存里取到100页数据。

      SQL Server存储的最小单位是页,每一页大小为8K,SQL Server对于页的读取是原子性的,要么读完一页,要么完全不读。即使是仅仅要获得一条数据,也要读完一页。而页之间的数据组织结构为B树结构。所以SQL Server对于逻辑读、预读、物理读的单位是页。

    示例:

          SQL SERVER一页的总大小为:8K

          但是这一页存储的数据会是:8K=8192字节-96字节(页头)-36字节(行偏移)=8060字节

          所以每一页用于存储的实际大小为8060字节.

          我们可以通过公式大概推算出占用了多少页:2032*1024/8060(每页的数据容量)≈258- 表中非数据占用的空间≈290(上图中的逻辑读取数)

          基本上,逻辑读、物理读、预读都等于是扫描了多少个页。

          SQL SERVER查询语句执行的顺序

      当SQL Server执行一个查询语句时,SQL Server会开始第一步,生成查询计划,查询处理器需要读取各个表的定义及表上各个索引的统计信息,当查询计划生成后,真正交给查询执行器执行时,SQL server 才会使用另外一个线程将查询“可能需要的数据”从磁盘读取的缓冲区中(前提是数据不在缓存中),这就是预读。SQL Server通过这种方式来提高查询性能。

      查询计划生成好了以后去缓存读取数据,当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读),然后从缓存中取出所有数据(逻辑读)。

      估计的页数可以通过DMV看到:select * from sys.dm_db_index_physical_stats... ,page_count 显示为254;

          此时再执行之前的查询语句:

        

         Storage engine notices pattern and kicks off read ahead, which starts to read data not yet requested into buffer pool. These are counted as read ahead reads, but not as logical or physical reads.Next time the scan or seek needs data, it is already in the buffer pool, so only logical io, no physical io.

        从外国论坛上看的,不难理解,就是第二次查询时,如果数据已经再缓存中了,那么只有逻辑读,没有物理读了,因为直接在缓存中可以找到这些数据了。

  • 相关阅读:
    java8 localdate 使用
    关于解决多个ifelse的探索(一)
    celery_worker异常退出
    宝塔面板实用教程(1):只需10分钟部署升讯威在线客服系统
    1个程序员单干之:怎样给我的升讯威在线客服系统编写堪比 MSDN 的用户手册
    .net core 和 WPF 开发升讯威在线客服系统:调用百度翻译接口实现实时自动翻译
    .net core 和 WPF 开发升讯威在线客服系统:怎样实现拔网线也不丢消息的高可靠通信(附视频)
    fetch API获取返回值的方式
    ant design charts 获取后端接口数据展示
    Java代码实现grpc服务
  • 原文地址:https://www.cnblogs.com/zhengxingpeng/p/6670410.html
Copyright © 2020-2023  润新知