zoukankan      html  css  js  c++  java
  • SQL Server逻辑读-预读-物理读

    SQL Server逻辑读-预读-物理读

      

    SQL Server 存储数据的方式

           1.页是最小的操作单元,也就是说从磁盘读取数据库的时候最少读取一页,每一页的大小是8KB,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态

           2.区是8个连续的页组成的,区是最小的分配单元,当需要空间时最少分配一个区的空间。

    看图说话,两个表的结构完全一样,一个插入四条数据,另一个插入100条数据,结果大小都为0.008;

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

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

          所以每一页用于存储的实际大小为8060字节.(测试表额数据)

           

           1.336*1024*1024/8060=173(约)

           根据这个公式计算而得到的就是,预读的次数(用估计信息,去硬盘读取数据到缓存)

    再看语句执行过程

    当遇到一个查询语句时,SQL SERVER会走第一步,分别为生成执行计划(占用CPU和内存资源),

    同步的用估计的数据去磁盘中取得需要取的数据(占用IO资源,这就是预读),注意,两个第一步是并行的,SQL SERVER通过这种方式来提高查询性能.

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

    最后从缓存中取出所有数据(逻辑读)。

    为了测试为精确,你可以加上:

    DBCC DROPCLEANBUFFERS (生产环境中不要使用.....)

    图解测试:

     

    总结:

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

     

  • 相关阅读:
    (剑指offer)斐波那契数列
    手写Vue源码 watch的实现
    Vue源码之异步批量任务更新
    手写Vue源码之 依赖收集
    C# 测试代码#if DEBUG使用
    shell脚本编程相关7
    C#中关于ref和out的认识
    shell脚本编程相关6
    shell脚本编程相关5
    shell脚本编程相关4
  • 原文地址:https://www.cnblogs.com/mc67/p/4874909.html
Copyright © 2011-2022 走看看