初谈SQL Server逻辑读、物理读、预读
前言
本文涉及的内容均不是原创,是记录自己在学习IO、执行计划的过程中学习其他大牛的博客和心得并记录下来,之所以想写下来是为了记录自己在追溯的过程遇到的几个问题,并把这些问题弄清楚。 本章最后已贴出原文地址。
1、SQL Server的数据存储方式
要理解逻辑读、物理读、预读这三个概念,先要搞懂SQL Server的数据存储方式。
SQL Server数据库包括数据文件和日志文件,一个数据库可以有一个或多少数据文件、日志文件。所有的数据存储在数据文件中,数据文件可以划分为再小的单元,我们称为“页”。每页大小8k。8个页面构成一个区。SQL Server对于页的读取是最原子性,要么读完一页,要么完全不读。页之间的数据组织结构为B树。 所以SQL Server对于逻辑读、物理读、预读的单位都是页。
2、剖析IO统计信息
2.1 初识三读
先来看个例子。示例数据库AdventureWorks。查询Sales.SalesOrderDetail
从截图中可以看出,这里读取多少次也就是读取了【多少页】数据。这个也是我一开始没搞懂的地方。
预读:在查询计划生成的过程中,用估计的信息去硬盘读取数据到缓存中,预读1242页,也就是从硬盘中读取了1242页放到了缓存中。
物理读:查询计划生成好以后,如果缓存缺少所需要的数据,再从硬盘里读取缺少的数据到缓存里。
逻辑读:从缓存中读取数据。逻辑读1240次,也就是从缓存中读取1240页数据。
2.2 逻辑读、物理读、预读的关系
再次运行上面的语句得出以下结果
从图中可以看出,这次没有屋里读取和预读次数,只有逻辑读取次数,根据前面的概念我们可以分析出:第二次查询可以直接从缓存中读取所需要的数据。 按照我们的理论,貌似逻辑读取次数=物理读取次数+预读次数。但你会发现前面我们1240并不等于1242+3.这又是为什么呢?
1、首先要说明,逻辑读取次数并不绝对等于物理读取次数和预读次数之和。第二次查询物理读取次数和预读次数都是0。预读是按照估计的信息去读取信息,因此读取的页数并不一定准确,可能多于也可能少于实际的页数。
2、如果预读的页数包括了全部数据,那么就不会有物理读取次数。
3、有时候出现逻辑读取次数大于物理读取次数加上预读次数,这是因为在预读之前缓存中已经存在部分需要的数据。
3、看图理解【逻辑读】、【物理读】、【预读】
当SQL Server执行一个查询时,SQL Server会开始第一步,生成执行计划。同时用估计的数据去硬盘读取数据(预读)。这两个第一步是并行的,SQL Server通过这种方式来提高查询性能。执行计划生成好以后去缓存读取数据。当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读)。然后从缓存中读取所有数据(逻辑读)。
估计的页数也可以从这个DMV中查询。如果第二次缓存后可使用DBCC DROPCLEANBUFFERS清理缓存(生产慎用)。
SELECT
page_count
FROM sys.dm_db_index_physical_stats
(DB_ID('AdventureWorks2008R2'),OBJECT_ID('Sales.SalesOrderDetail'),NULL,NULL,'sampled')
总结
理解逻辑读、物理读、预读这三个概念主要是理解语句的查询过程以及那个步骤是去缓存数据、那个步骤又是去硬盘读取数据、那个步骤又是根据估计的信息去读取数据。从应用的角度来说这三个数量并不是绝对的数量加和关系,关键还是要看理论语句的查询过程。在对语句进行优化时重点还是逻辑读的次数,通过优化语句来检查逻辑读的次数来减少IO开销。
参考资料
http://www.canway.net/Original/shujuku/012CE2016.html
http://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html
http://www.cnblogs.com/kissdodog/archive/2013/06/25/3155016.html
初谈SQL Server逻辑读、物理读、预读的更多相关文章
- 初谈SQL Server逻辑读、物理读、预读【转】
前言 本文涉及的内容均不是原创,是记录自己在学习IO.执行计划的过程中学习其他大牛的博客和心得并记录下来,之所以想写下来是为了记录自己在追溯的过程遇到的几个问题,并把这些问题弄清楚. 本章最后已贴出原 ...
- SQL Server逻辑读、预读和物理读
SQL Server数据存储的形式 预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存 ...
- 浅谈SQL Server中的事务日志(一)----事务日志的物理和逻辑构架
简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...
- 【SqlServer系列】浅谈SQL Server事务与锁(上篇)
一 概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...
- 浅谈SQL Server数据内部表现形式
在上篇文章 浅谈SQL Server内部运行机制 中,与大家分享了SQL Server内部运行机制,通过上次的分享,相信大家已经能解决如下几个问题: 1.SQL Server 体系结构由哪几部分组成? ...
- 浅谈SQL Server事务与锁(上篇)
一 概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章试图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...
- 再谈SQL Server中日志的的作用
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server ...
- 浅谈SQL Server内部运行机制
对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL的哪些方面是他们的挑战 或者软肋呢? 那就是 ...
随机推荐
- 【AR实验室】ARToolKit之概述篇
0x00 - 前言 我从去年就开始对AR(Augmented Reality)技术比较关注,但是去年AR行业一直处于偶尔发声的状态,丝毫没有其"异姓同名"的兄弟VR(Virtual ...
- 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
- 【大型网站技术实践】初级篇:借助LVS+Keepalived实现负载均衡
一.负载均衡:必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- 开源一个跨平台运行的服务插件 - TaskCore.MainForm
本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.Main ...
- UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面[UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理]章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例. 原代码地址:ht ...
- C#数组,List,Dictionary的相互转换
本篇文章会向大家实例讲述以下内容: 将数组转换为List 将List转换为数组 将数组转换为Dictionary 将Dictionary 转换为数组 将List转换为Dictionary 将Dicti ...
- 用神奇的currentColor制作简洁的颜色动画效果
先上一个兼容性总结图:老版本ie可以直接用复杂方法了,套用某表情包的话: 2016年了,做前端你还考虑兼容IE6?你这简直是自暴自弃! 好了,知道了兼容性,我们可以放心的使用了. 在CSS3中扩展了 ...
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- equals变量在前面或者在后面有什么区别吗?这是一个坑点
我就不废话那么多,直接上代码: package sf.com.mainTest; public class Test { public static void main(String[] args) ...