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

SQL Server数据存储的形式

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

  SQL Server存储的最小单位是页,每一页大小为8K,SQL Server对于页的读取是原子性的,要么读完一页,要么完全不读。即使是仅仅要获得一条数据,也要读完一页。而页之间的数据组织结构为B树结构。所以SQL Server对于逻辑读、预读、物理读的单位是页。

  先来看一个查询:

  DBCC DROPCLEANBUFFERS    --清空缓存
  SET STATISTICS IO ON    --开启IO统计
  SELECT * FROM Person    --查询语句

  显示消息如下:

(147517 行受影响)
表 ‘Person‘。扫描计数 1,逻辑读取 2237 次,物理读取 6 次,预读 2226 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

  

  上表的大小是17.406M。

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

  17.406*1024*1024 / 8060 ≈ 2 264

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

  基本上,逻辑读、物理读、预读都等于是扫描了多少个页。

从执行顺序上理解各种读

  SQL Server的查询从理解各种读的步骤来看,可以理解为以下图:

  (图是CareySon大哥的)

  通过上图来讲解各种读:

  当SQL Server执行一个查询语句时,SQL Serer会开始第一步,生成查询计划,同时用估计的数据去磁盘读取数据(预读),这两个第一步是并行的。SQL Server通过这种方式来提高查询性能。

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

  估计的页数可以通过DMV看到

  SELECT
  page_count
  FROM sys.dm_db_index_physical_stats
  (DB_ID(‘TestDataCenter‘),OBJECT_ID(‘Person‘),NULL,NULL,‘sampled‘)

  显示结果如下:

  

  SQL Server就是根据这个东西进行预读。

  如果此时我们再执行上面的查询语句:

  SELECT * FROM Person    --查询语句

  看到消息如下:

(147517 行受影响)
表 ‘Person‘。扫描计数 1,逻辑读取 2237 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

(1 行受影响)

  为什么这次全部都是逻辑读呢。因为刚才读过一次,数据全部都已经在缓存当中了,只需要从缓存中读就可以了,不需要再读取硬盘。

  本文学习自:http://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html

时间: 2024-10-12 21:57:27

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

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

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

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

SQL Server逻辑读-预读-物理读    SQL Server 存储数据的方式        1.页是最小的操作单元,也就是说从磁盘读取数据库的时候最少读取一页,每一页的大小是8KB,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态 2.区是8个连续的页组成的,区是最小的分配单元,当需要空间时最少分配一个区的空间. 看图说话,两个表的结构完全一样,一个插入四条数据,另一个插入100条数据,结果大小都为0.008: SQL SERVER一页的总大小为:8K

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

[摘要] 对SQL Server数据库进行性能优化时,有一个重要的工作是优化IO开销.通过开启Statistics IO,我们可以了解到语句执行的IO开销,包含物理读.逻辑读.预读等.而我们是否了解这三者的区别和联系呢,相信很多人都不是很理解,下面我们一起来探索这三者究竟分别代表着什么. [正文] 一  .SQLServer数据存储方式 SQL Server的数据库包括数据文件和日志文件,一个数据库可以有一个或多个数据文件或日志文件. 所有的数据都存储在数据文件中,而数据文件可以划分为再小的单元

SQL Server索引进阶:第九级,读懂执行计划

原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQL Server Indexes)的一部分. 在这个系列中,我们经常会以特定的方式执行特定的查询.我们引用生成的执行计划来支持我们的论调.SQL Server管理器显示的预估的和实际的查询计划,可以帮助我们确定索引的好处,以及其中的缺陷.因此,本文的主要目的是给你一些关于执行计划的充分的理解: 验证

SQL Server 逻辑转换

使用 OR 逻辑是因为它符合人们的思维习惯.用使用 OR 逻辑的逻辑表达式来确定优先级和标识锚点行之后的行,也相当直观. 但是,因为 SQL Server 优化器的工作方式,OR 逻辑在性能方面存在问题,特别是当一些被筛选的列上没有索引时. 例如,考虑这样一个筛选器“col1=5 or col2=10”.如果分别在 col1 和 col2 上有单独的索引,优化器可以先在每个索引中筛选出行,然后再对两个结果执行索引交集运算(index intersection)运算.然而,如果只在其中一列上有索引

SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称

原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf: 需要修改数据库名称为 bb,物理文件名称为 bb.mdf 和 bb_log.ldf: 具体操作步骤(以sqlserver2005操作 为例): 把原有数据库进行备份(选择数据库->右键->任务->备份),被分为aa.bak: 新建数据库bb,然后 右键->任务->还原->数据库,选择“源设备”,浏览,跳出“指定备份”对话框,点击添加找到刚才备份的aa.bak: “选择用于还原的备份集”,选

SQL SERVER逻辑查询处理阶段简介

逻辑查询处理阶段简介 FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1 ON:对VT1应用ON筛选器.只有那些使为真的行才被插入VT2. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到VT2,生

sqlserver性能调优中的逻辑读,物理读,预读是什么意思

表 'T_EPZ_INOUT_ENTRY_DETAIL'.扫描计数 1,逻辑读 4825 次,物理读 6 次,预读 19672 次.SQL SERVER 数据库引擎当遇到一个查询语句时,SQL SERVER数据库引擎会分别生成执行计划(占用CPU和内存资源),同时存储引擎读取 IAM 以生成必须要读取的磁盘地址排序列表.这使 SQL Server 得以将其 I/O 优化为大型有序读取,根据它们在磁盘上的位置按顺序完成.磁盘中取得需要取的数据(占用I/O资源,这就是预读),注 意,两个步骤是并行的

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我