SQL SERVER中的逻辑读取,物理读取,以及预读的理解
在SQLSERVER查询分析器中,当我们用Set Statistics on 语句来统计SQL语句或者存储过程I/O的时候,
SQLSERVER会显示几个概念去词语:逻辑读取,物理读取,预读。
如下:
(1 行受影响)
表 't2'。扫描计数 1,逻辑读取 3282 次,物理读取 44 次,预读 3282 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
那么,这几个词语代表什么意思呢?我们怎么根据这些来了解SQL语句或者存储过程的I/O过程呢?
预读:用于估计信息,去硬盘读取数据到缓存。
物理读:查询计划生成以后,如果发现缓存缺少所需要的数据,让缓存再次去读硬盘数据。如果内存里没有缓存数据或者执行计划(如果SQL语句发生了改变,
那么执行计划将不能重用,需要重新生成新的执行计划),那么SQLSERVER就要去硬盘读取这些数据,这个时候就是物理读取,我们大家都知道,硬盘速度
与内存速度根本不在一个数量级上,所以物理读是比较慢的。
逻辑读:SQLSERVER去内存里的缓存取数据或者执行计划,所以逻辑读是比较快的。
SQLSERVER存储的最小单位是页,每一页大小为8K,即8*1024=8192字节,SQLSERVER对页的读取是原子性的,即要么读完一页,要么完全不读。即使
仅仅要获得一条数据,也要读完该页,而页之间的数据组织结构为B树结构。所以SQLSERVER对于逻辑读,物理读,预读的单位是页。
先来看一个查询:
DBCC DROPCLEANBUFFERS --清空缓存
SET STATISTICS IO ON --开启IO统计
SELECT * FROM SAMPLE --查询
显示消息如下:
(147517 行受影响)
表'SAMPLE'。扫描计数 1,逻辑读取2237次,物理读取6次,预读2226次,lob读取0次

上表的大小事17.406M。
每一页存储的数据是8K=8192字节-96字节(页头)-36字节(行偏移)=8060字节。
17.406*1024*1024/8060约等于2264.
另外表中还有一些非数据占用的空间,因此上式的结果约等于逻辑读次数。
基本上,逻辑读,物理读,预读都等于是扫描了多少个页。
SQLSERVER的查询从理解各种读的步骤来看,可以理解为下图

通过上图来解释下各种读的方式:
SQLSERVER执行一个查询语句的时候,SQLSERVER会执行第一个步骤,即生成查询计划,同时用估计的数据去磁盘读取数据(预读)
,这两个都是第一步,是并行的。SQLSERVER通过这种方式来提高查询性能。
当查询计划生成好以后,开始去缓存读取数据,当发现缓存缺少所需要的数据的时候,让缓存再次去硬盘读取数据(物理读),然后从缓存
中取出所有数据(逻辑读)。
估计的页数可以通过DMV来看到
select pagecount from sys.dm_db_index_physical_stats
(DB_ID('TESTDATACENTER'),OBJECT_ID('SAMPLE'),null,null,'sampled')
显示结果如下:

SQLSERVER就是根据这个数值进行预读的。
如果我们此时再执行上面的查询语句
select * from sample --查询
看到消息如下:
(147517 行受影响)
表'SAMPLE'。扫描计数1,逻辑读取2237次,物理读取0次,预读0次,lob逻辑读取0次。
读者也许不明白了,为什么这次全部都是逻辑读取呢?
答案是因为刚才执行过这样一个查询,执行计划与数据都在缓存当中,所以只需要从缓存中读取就可以了,
不需要再读取硬盘。
本文系自己消化并转载
地址:http://www.studyofnet.com/news/94.html。
SQL SERVER中的逻辑读取,物理读取,以及预读的理解的更多相关文章
- 理解SQL SERVER中的逻辑读,预读和物理读
转自:https://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html 在我的上一篇关于SQL SERVER索引的博文,有圆友问道关于逻 ...
- [SQL] 理解SQL SERVER中的逻辑读,预读和物理读
SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小单位为页(Page).每一页大小为8k,SQL SERVE ...
- SQL Server 中的逻辑读与物理读
首先要理解逻辑读和物理读: 预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读 ...
- SQL SERVER中的逻辑读,预读和物理读
sqlserver:数据存储方式:最小单位是页,每一页8k,sqlserver 对页的读取是具有原子性,也就是说,要么读取完整一页,要么完全不读取,不会有中间状态,而页之间的数据组织结构是B树 但是每 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- SQL点滴9—SQL Server中的事务处理以及SSIS中的内建事务
原文:SQL点滴9-SQL Server中的事务处理以及SSIS中的内建事务 我们可以把SSIS中的整个package包含在一个事务中,但是如果在package的执行过程中有一个表需要锁定应该怎么处理 ...
- SQL Server中STATISTICS IO物理读和逻辑读的误区
SQL Server中STATISTICS IO物理读和逻辑读的误区 大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况 SET STATISTICS IO ON 那么这个命令 ...
- 如果正确读取SQL Server中的扩展事件?
SQL Server中使用扩展事件捕捉所需的信息后,可以选择存放的位置.比如说内存或文件中,但无论存在哪里,其本质都是一个大XML.因此在SQL Server中读取该XML就是解析扩展事件结果 ...
- 此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行
错误提示:此操作只能由 SQL Server 中拥有配置数据库读取权限的用户在已加入到某个服务器场的计算机上执行.若要将此服务器连接到服务器场,请使用 SharePoint 产品配置向导,该向导可从 ...
随机推荐
- 向html中添加节点
简单: ①,js中: (function () { var box=document.querySelector("#box"); var con1=document.create ...
- Git入门及上传项目到github中
最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...
- python中time模块的用法
import time tick = time.time() # 返回从12:00am, January 1, 1970(epoch) 开始的记录的当前操作系统时间 present = time.lo ...
- hdu---(Tell me the area)(几何/三角形面积以及圆面积的一些知识)
Tell me the area Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Remove Nth Node From End of List [LeetCode]
Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...
- 221. Maximal Square -- 矩阵中1组成的最大正方形
Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...
- spring之初识Ioc&Aop
Spring框架的作用 spring是一个轻量级的企业级框架,提供了ioc容器.Aop实现.dao/orm支持.web集成等功能,目标是使现有的java EE技术更易用,并促进良好的编程习惯. Spr ...
- Spark(3) - External Data Source
Introduction Spark provides a unified runtime for big data. HDFS, which is Hadoop's filesystem, is t ...
- CentOS命令登录MySQL时,报错ERROR 1045 (28000):
CentOS命令登录MySQL时,报错ERROR 1045 (28000): Access denied for user root@localhost (using password: NO)错误解 ...
- 通过计算机名访问linux
1.安装samba 2.设置/etc/samba/smb.conf的 netbois name 配置节的值为你要设置的名称,如 netbois name = mylinux 也可以不设置此项,如果不设 ...