SQL Server 中的逻辑读与物理读

SQL Server 中的逻辑读与物理读

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

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

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

示例:

<span>SQL Server 中的逻辑读与物理读</span><span>SQL Server 中的逻辑读与物理读</span>

      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;

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

    <span>SQL Server 中的逻辑读与物理读</span>

     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.

    从外国论坛上看的,不难理解,就是第二次查询时,如果数据已经再缓存中了,那么只有逻辑读,没有物理读了,因为直接在缓存中可以找到这些数据了。
参考http://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119762.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • BN层的作用_bn层加在哪里

    BN层的作用_bn层加在哪里一:BN层李宏毅视频讲解BN(BatchNormalization)层的作用(1)加速收敛(2)控制过拟合,可以少用或不用Dropout和正则(3)降低网络对初始化权重不敏感(4)允许使用较大的学习率 链接:https://www.zhihu.com/question/38102762/answer/85238569来源:知乎1.WhatisBN?顾名思义,batchnormalizat…

    2022年10月10日
    0
  • 2022Android SDK下载与安装

    2022Android SDK下载与安装一、下载sdk:https://www.androiddevtools.cn找个合适的位置解压双击“SDKManager.exe”,启动SDKManager安装工具我们可以通过有AndroidSDK的国内镜像服务器来下载安装,这里推荐几个:1、中科院开源协会镜像站地址:IPV4/IPV6:http://mirrors.opencas.ac.cn端口:802、北京化工大学镜像服务器地址:IPv4:http://ubuntu.buct.edu.cn/端口:80IPv

    2022年7月19日
    16
  • 如何设计单元测试用例「建议收藏」

    如何设计单元测试用例「建议收藏」如何编写单元测试用例(白盒测试)。一、单元测试的概念单元通俗的说就是指一个实现简单功能的函数。单元测试就是只用一组特定的输入(测试用例)测试函数是否功能正常,并且返回了正确的输出。测试的覆盖种类1.语句覆盖:语句覆盖就是设计若干个测试用例,运行被测试程序,使得每一条可执行语句至少执行一次。2.判定覆盖(也叫分支覆盖…

    2022年6月18日
    29
  • ARIMA_如何确定arima模型的阶数

    ARIMA_如何确定arima模型的阶数1 总体介绍在以下主题中,我们将回顾有助于分析时间序列数据的技术,即遵循非随机顺序的测量序列。与在大多数其他统计数据的上下文中讨论的随机观测样本的分析不同,时间序列的分析基于数据文件中的连

    2022年8月5日
    3
  • 时间单位换算表

    时间单位换算表 时间单位换算表   1毫秒=1/1,000秒(s)               1秒=1000毫秒(ms)1微秒(μs)=1/1,000,000秒(s)    1秒=1,000,000微秒(μs)1纳秒=1/1,000,000,000秒(s)       1秒=1,000,000,000纳秒(ns)1皮秒=1/1,000,000,000,000秒(s) 

    2022年7月11日
    36
  • linux mqtt客户端

    linux mqtt客户端实现功能:(1)定时30s发送心跳包;(2)接收mqtt数据包,解析函数是user_recv_handle_cb;(3)定时PERIOD_TIME发布自身订阅的主题信息,即循环PERIOD_TIME发啥收啥。说明:(1)主要根据庆科的MiCO_A_v3.2.0/demos/net/mqtt_client的stm32freeRTOS移植到li…

    2022年10月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号