浅谈SQL Server逻辑读、物理读和预读

【摘要】

对SQL Server数据库进行性能优化时,有一个重要的工作是优化IO开销。通过开启Statistics IO,我们可以了解到语句执行的IO开销,包含物理读、逻辑读、预读等。而我们是否了解这三者的区别和联系呢,相信很多人都不是很理解,下面我们一起来探索这三者究竟分别代表着什么。

【正文】

一  、SQLServer数据存储方式

SQL Server的数据库包括数据文件和日志文件,一个数据库可以有一个或多个数据文件或日志文件。

所有的数据都存储在数据文件中,而数据文件可以划分为再小的单元,我们称为页。页是最小的操作单元,也就是说从磁盘读取数据库的时候最少读取一页,每一页的大小是8KB。另一个概念是区,区是8个连续的页组成的,区是最小的分配单元,当需要空间时最少分配一个区的空间。

二  、剖析SQLServer IO统计信息

2.1      初识逻辑读、物理读和预读

我们先举一个例子。

第一次查询数据库AdventureWorks下的表Sales.SalesOrderDetail时,显示“逻辑读取1240次,物理读取5次,预读1250次”。

无论是逻辑读、物理读还是预读的单位都是页,上次我们已经介绍过了。SQL Server对于页的读取是原子性的,要么读完一页,要么完全不读,并且每一页的大小是8KB。

预读:在查询计划生成过程中,用估计信息,去硬盘读取数据到缓存中。预读1250次,也就是估计将要从硬盘中读取了1250页数据并存放到缓存中。

物理读:查询计划生成好以后,如果缓存缺少所需要的数据,再从硬盘中读取缺少的数据到缓存中。

逻辑读:从缓存中取出所有数据。逻辑读1240次,也就是从缓存里取到1240页数据。

2.2      语句执行过程剖析

我们再来回顾上面的查询经历的过程:

1.     首先在生成执行计划过程中,SQL Server首先从硬盘预计了1250次,也就是读取了1250*8KB=10,000KB的数据并且存入缓存中(也就是预读的过程

2.     当执行查询计划时,发现缓存的数据还不够。则继续从硬盘读取额外需求的数据并存入缓存中(也就是物理读的过程

3.     接着SQL Server再从缓存读取全部需要的数据并返回到客户端。(也就是逻辑读的过程

2.3      逻辑读、物理读和预读的关系

当我们再次运行上面的查询语句时,得到的信息如下:

我们可以发现,这次没有物理读取和预读,只有逻辑读,这是为什么呢?我们前面已经剖析过原理了,因为第二次查询时直接从缓存就可以读取到所需要的数据。

按照我们介绍的理论,貌似逻辑读取的次数=物理读取的次数+预读的次数。但细心的读者会发现,第一次查询时“逻辑读取1240次,物理读取5次,预读1250次”,我们发现逻辑读取的次数不等于物理读取的次数与预读的次数之和。这又是为什么呢?

1.     首先需要说明的是,逻辑读取的次数并不一定等于物理读取的次数与预读的次数之和。一个很简单例子是第二次查询时物理读取和预读都是0。实际上,预读是按照估计的信息去读取数据,因此读取的页数并不一定准确,可能多于实际的页数也可能少于实际的页数。

2.     如果预读的页数包含了全部的数据,那么就不会有物理读取

3.     有时候会出现逻辑读取的次数大于物理读取的次数与预读的次数之和。这是因为在预读之前缓存中已经存在部分需要的数据。

三  、小结

理解逻辑读、物理读和预读这三个概念,关键是理解语句的查询过程以及哪一个步骤是从缓存读取数据、哪一个步骤是从硬盘读取数据、哪一个步骤又是根据估计的信息去读取数据,这样也就能理解这三个概念了。

逻辑读、物理读和预读这三个的次数并不存在绝对的数量关系,关键还是要理论语句的查询过程。

在对语句进行优化时,重点是优化逻辑读取的次数。通过优化语句来减少逻辑读取的次数,从而也就减少IO开销。

时间: 2024-12-07 00:14:21

浅谈SQL Server逻辑读、物理读和预读的相关文章

浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架

浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确保了事务的ACID属性.在SQL Server崩溃时,DBA还可以通过事务日志将数据恢复到指定的时间点.当SQL Server运转良好时,多了解一些事务日志的原理和概念显得并不是那么重要.但是,一旦SQL SERVER发生崩

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色

浅谈SQL Server中的事务日志(四)----在完整恢复模式下日志的角色 本篇文章是系列文章中的第四篇,也是最后一篇,本篇文章需要前三篇的文章知识作为基础,前三篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 简介 生产环境下的数据是如果可以写在资产负债表上的话,我想这个资产所占的数额一定不会

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色

浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 本篇文章是系列文章中的第二篇,以防你还没有看过第一篇.上一篇的文章地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 简介 每一个SQL Server的数据库都会按照其修改数据(insert,update,delete)的顺序将对应的日志记录到日志文件.SQL Server使用了Write-Ahead logging技术来保证了事务日志的原子性和持久性.而这项技术不仅仅保证了ACID

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色 本篇文章是系列文章中的第三篇,前两篇的地址如下: 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架 浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色 简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在开始文章之前,首先

浅谈SQL Server数据库分页

数据库分页是老生常谈的问题了.如果使用ORM框架,再使用LINQ的话,一个Skip和Take就可以搞定.但是有时由于限制,需要使用存储过程来实现.在SQLServer中使用存储过程实现分页的已经有很多方法了.之前在面试中遇到过这一问题,问如何高效实现数据库分页.刚好上周在业务中也遇到了这个需求,所以在这里简单记录和分享一下. 一 需求 这里以SQLServer的示例数据库NorthWind为例,里面有一张Product表,现在假设我们的需求是要以UnitPrice降序排列,并且分页,每一页10条

浅谈SQL Server任务调度

在前面两篇文章中( 浅谈SQL Server内部运行机制 and 浅谈SQL Server数据内部表现形式 ),我们交流了一些关于SQL Server的一些术语,SQL Sever引擎 与SSMS抽象模型,SQL Server内部存储机制和SQL Server内部体系结构等.讨论的这些问题,均可以归为一个问题,即"SQL Server是怎么执行客户端输入的SQL 语句的?”,其中,重点讨论了下图(SQL Server 体系结构) 然而,如果我们仅仅了解如上技术,是不具备一个资深DBA或数据库优化

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

前言 本文涉及的内容均不是原创,是记录自己在学习IO.执行计划的过程中学习其他大牛的博客和心得并记录下来,之所以想写下来是为了记录自己在追溯的过程遇到的几个问题,并把这些问题弄清楚. 本章最后已贴出原文地址. 1.SQL Server的数据存储方式 要理解逻辑读.物理读.预读这三个概念,先要搞懂SQL Server的数据存储方式. SQL Server数据库包括数据文件和日志文件,一个数据库可以有一个或多少数据文件.日志文件.所有的数据存储在数据文件中,数据文件可以划分为再小的单元,我们称为“页

浅谈SQL Server 对于内存的管理

简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) 对于计算机来说,存储体系是分层级的.离CPU越近的地方速度愉快,但容量越小(如图1所示).比如:传统的计算机存储体系结构离CPU由近到远依次是:CPU内的寄存器,一级缓存,二级缓存,内存,硬盘.但同时离CPU越远的存储系统都会比之前的存储系统大一个数量级.比如硬盘通常要比同时代的内存大一个数量级.

浅谈SQL Server中的快照

原文地址:http://www.cnblogs.com/CareySon/archive/2012/03/30/2424880.html 简介 数据库快照,正如其名称所示那样,是数据库在某一时间点的视图.是SQL Server在2005之后的版本引入的特性.快照的应用场景比较多,但快照设计最开始的目的是为了报表服务.比如我需要出2011的资产负债表,这需要数据保持在2011年12月31日零点时的状态,则利用快照可以实现这一点.快照还可以和镜像结合来达到读写分离的目的.下面我们来看什么是快照. 什