初谈逻辑读、物理读、预读

前言:

该文并不全是本人原创,里面的某些原理来自于CareySon。

SQL SERVER数据存储的形式

要理解逻辑读、物理读、预读这三个概念,先要搞懂SQL Server的数据存储方式。

       SQL Server数据库包括数据文件和日志文件,一个数据库可以有一个或多少数据文件、日志文件。所有的数据存储在数据文件中,数据文件可以划分为再小的单元,我们称为“页”。每页大小8k。8个页面构成一个区。SQL Server对于页的读取是最原子性,要么读完一页,要么完全不读。页之间的数据组织结构为B树。 所以SQL Server对于逻辑读、物理读、预读的单位都是页。

创建如下测试表:

BEGIN TRAN
--CREATE TABLE
CREATE TABLE [dbo].[TestCount]([C1] [varchar](400) NULL,[C2] [varchar](300) NULL,[C3] [varchar](150) NOT NULL,[C4] [varchar](80) NULL,[C5] [varchar](38) NOT NULL,[C6] [int] NOT NULL,CONSTRAINT [PK_TestCount] PRIMARY KEY CLUSTERED 
([C6] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
-----------------------
DECLARE @COUNT INT =1
SET NOCOUNT ON
WHILE @COUNT<=15000
BEGININSERT TestCountSELECT NEWID(),NEWID(),NEWID(),NEWID(),NEWID(),@COUNTSET @COUNT=@COUNT+1
END
commit

由于对页的读取是原子性的,以下读取了多少次就是读了多少页

上面查询逻辑读 387,该表是3.008M,每一页存储的数据是:8K=8192字节-96字节(页头)-36字节(行偏移)= 8060字节。

3.008*1024*1024 / 8060 ≈ 391

另外表中还有一些非数据占用的空间,因此上式的结果约等于逻辑读次数。

第二次执行上面相同的语句:

可以看到,本次就只有逻辑读了,没有上面的预读了,这是因为第一次读取的时候引擎就把读到的资料放在了缓存中,方便后面的读取(缓存的读取速度约是机械硬盘速度的20倍),而第二次读的时候只需要读缓存就行了。

从执行顺序上理解各种读

 

      下面我解释一下图。当遇到一个查询语句时,SQL SERVER会走第一步,分别为生成执行计划(占用CPU和内存资源)和用估计的数据去磁盘中取得需要取的数据(占用IO资源,这就是预读),注意,两个第一步是并行的,SQL SERVER通过这种方式来提高查询性能.

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

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

查询计划在生成,但未交给查询执行器执行之前,SQL SERVER 并不产生‘预读(但在生成执行计划时,查询处理器需要读取各个表的定义及表上各个索引的统计信息)。

当查询计划生成后,真正交给查询执行器执行时,SQL server 才会使用另外一个线程将查询“可能需要的数据”从磁盘读取的缓冲区中(前提是数据不在缓存中),这就是预读。同时这也意味着查询执行时进行逻辑运算的线程与“预读”所使用的线程并不是相同的线程。

   这个预读的页数数据可以通过这个DMV看到:

SELECT 
*
FROM sys.dm_db_index_physical_stats
(DB_ID('Test'),OBJECT_ID('TestCount'),NULL,NULL,'sampled')

 小结:

     1、首先要说明,逻辑读取次数并不绝对等于物理读取次数和预读次数之和。第二次查询物理读取次数和预读次数都是0。预读是按照估计的信息去读取信息,因此读取的页数并不一定准确,可能多于也可能少于实际的页数。
     2、如果预读的页数包括了全部数据,那么就不会有物理读取次数。
     3、有时候出现逻辑读取次数大于物理读取次数加上预读次数,这是因为在预读之前缓存中已经存在部分需要的数据。

转载于:https://www.cnblogs.com/ziqiumeng/p/10212292.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Makefile常用万能模板(包括静态链接库、动态链接库、可执行文件)

1、生成可执行文件的makefile2、生成静态链接库的makefile3、生成动态链接库的makefile 本文把makefile 分成了三份&#xff1a;生成可执行文件的makefile&#xff0c;生成静态链接库的makefile&#xff0c;生成动态链接库的makefile。 这些makefile都很简单&#xff0c;一般都…

Python数据分析之pandas入门

一、pandas库简介 pandas是一个专门用于数据分析的开源Python库&#xff0c;目前很多使用Python分析数据的专业人员都将pandas作为基础工具来使用。pandas是以Numpy作为基础来设计开发的&#xff0c;Numpy是大量Python数据科学计算库的基础&#xff0c;pandas以此为基础&#x…

激光雷达和毫米波雷达的区别

什么是激光雷达 激光雷达&#xff0c;是以发射激光束探测目标的位置、速度等特征量的雷达系统。其工作原理是向目标发射探测信号&#xff08;激光束&#xff09;&#xff0c;然后将接收到的从目标反射回来的信号&#xff08;目标回波&#xff09;与发射信号进行比较&#xff0c…

Git—使用方法

1、:插件的安装&#xff08;eclipse LUNA版本之后已经自动集成&#xff0c;不需要安装插件&#xff09;、 * 先打开该网页提供了对应版本的EGit&#xff0c;自己选择相应的版本。&#xff08;http://wiki.eclipse.org/EGit/FAQ#Where_can_I_find_older_releases_of_EGit.3F&…

激光雷达与毫米波雷达对比

激光雷达是一种采用非接触激光测距技术的扫描式传感器&#xff0c;其工作原理与一般的雷达系统类似&#xff0c;通过发射激光光束来探测目标&#xff0c;并通过搜集反射回来的光束来形成点云和获取数据&#xff0c;这些数据经光电处理后可生成为精确的三维立体图像。采用这项技…

安全可靠国产系统下的应用怎么搭建?

据国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;统计数据&#xff0c;2016年我国共收录通用软硬件漏洞 10822个&#xff0c;漏洞来源涵盖了众多知名的国外厂商。应用软件的不安全性对我国信息技术发展产生了重大威胁&#xff0c;近年来我国频繁发布信息安全相关政策&a…

Win10 + Python + MXNet + VS2015配置

项目需要使用MTCNN来检测、对齐、剪切出人脸&#xff0c;它是使用MXNet作为框架的&#xff0c;但是我自己的Ubuntu里各种框架乱成一团&#xff0c;不想再添乱就铁了心要在windows里配一个。无奈网上的资料不多&#xff0c;挣扎了几天之后决定留下这么一份文档。 首先我们使用的…

bzoj 3224 Tyvj 1728 普通平衡树

题目大意&#xff1a; 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一些数&#xff0c;其中需要提供以下操作&#xff1a; 1. 插入x数 2. 删除x数(若有多个相同的数&#xff0c;因只删除一个) 3. 查询x数的排名(若有多个相同的数&#xff0c…

不懂毫米波雷达?5分钟读懂毫米波雷达的那些事儿

2019年是毫米波风生水起的一年&#xff0c;也是毫米波名声大噪的一年。毫米波应用范围广泛&#xff0c;如毫米波雷达、毫米波天线等。而本文&#xff0c;将向大家介绍毫米波雷达&#xff0c;主要内容包括&#xff1a;毫米波雷达原理、毫米波雷达主要特点、毫米波雷达优势以及毫…

redis集群的搭建

########环境######### centos 7.2 , gcch 环境ruby 2.0.0 redis 3.2.8 redis-3.3.3gem 公司要求搭建redis集群, 本来觉得挺好搞的,没想到弄到现在.... 1, 环境准备 gcc , ruby 等环境准备 yum -y install gcc ruby ruby-devel rubygems rpm-build zlib redis-ruby接口安装, 我…

2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结 找出全书你认为最重要的一章&#xff0c;深入重新学习一下&#xff0c;要求&#xff08;期末占10分&#xff09;&#xff1a; 完成这一章所有习题详细总结本章要点给你的结对学习搭档讲解你的总结并获取反馈我选…

进程间五种通信方式

进程间通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同进程之间传播或交换信息。 IPC的方式通常有管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机…

电子书下载:Silverlight 5 in Action

下载&#xff1a;http://www.ctdisk.com/file/8447319

Virtualbox桥接网卡设置

正常情况下&#xff0c;像设置virtualbox虚拟机的桥接网卡非常简单&#xff0c;只需要点配置&#xff0c;然后在配置界面点击网络&#xff0c;然后在右边的网络里选择桥接网络即可。但是如果这么简单就好了&#xff0c;今天要说的就是在不正常的情况下是怎么设置的。 工具/原料…

SQL疑难杂症【4 】大量数据查询的时候避免子查询

前几天发现系统变得很慢&#xff0c;在Profiler里面发现有的SQL执行了几十秒才返回结果&#xff0c;当时的SQL如下&#xff1a; 可以看得出来&#xff0c;在652行用了子查询&#xff0c;恰巧目标表(QS_WIP)中的记录数为100000000&#xff0c;通过如下SQL可以得到&#xff1a; S…

『原创』一个基于Win CE 5.0的Txt文件阅读器

最近&#xff0c;拿到一台亲戚送的GPS导航仪&#xff0c;其系统是基于WinCE5.0的&#xff0c;所以我觉得可以写点小程序上去&#xff0c;上网一搜&#xff0c;还附带破解方法&#xff0c;把GPS破解后就变成一台屏幕超大的PDA了&#xff0c;于是我想用它看电子书&#xff0c;无奈…

ARM Cortex-A系列(A53、A57、A73等)处理器性能分类与对比

在如今这个电子产品泛滥的年代&#xff0c;仅仅靠品牌或是外观已经不足以辨别产品的优劣&#xff0c;其内置的处理器自然也就成为了分辨产品是否高端的标准之一。那么我们今天就不妨好好了解一下近几年来电子产品中较为主流的RAM处理器。 在这之前让我们先简单认识一下处理器的…

.NET 3.5 - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除

步步为营VS 2008 .NET 3.5(8) - DLINQ(LINQ to SQL)之面向对象的添加、查询、更新和删除作者&#xff1a;webabcd介绍以Northwind为示例数据库&#xff0c;DLINQ(LINQ to SQL)之完全面向对象的添加操作、查询操作、更新操作和删除操作示例Sample.aspx <% Page Language&quo…

ARM版本系列及家族成员梳理

ARM公司简介 ARM是Advanced RISC Machines的缩写&#xff0c;它是一家微处理器行业的知名企业&#xff0c;该企业设计了大量高性能、廉价、耗能低的RISC &#xff08;精简指令集&#xff09;处理器。 1985年第一个ARM原型在英国剑桥诞生。 公司的特点是只设计芯片&#xff0c…

tomcat源码阅读之StandardHost和StandardEngine

StandardHost及UML类图&#xff1a; 1、StandardHost类是Host接口的默认实现&#xff1b;其继承自ContainerBase类&#xff0c;说明他也是一个容器类&#xff0c;既然是容器类&#xff0c;那肯定也有管道对象PipeLine和阀门&#xff0c;其基础阀门&#xff08;Basic Valve&…