通过以下语句清楚数据缓存并开启IO统计:

/****** 生产环境不可乱用 ******/
DBCC DROPCLEANBUFFERS; --清除缓存
SET STATISTICS IO ON; --开启IO统计
SELECT * FROM FoodCorp;

  示例:

  

一、相关定义

  SQL SERVER 数据库引擎当遇到一个查询语句时,SQL SERVER数据库引擎会分别生成执行计划(占用CPU和内存资源),同时存储引擎读取 IAM 以生成必须要读取的磁盘地址排序列表。这使 SQL Server 得以将其 I/O 优化为大型有序读取,根据它们在磁盘上的位置按顺序完成。磁盘中取得需要取的数据(占用I/O资源,这就是预读),注意,两个步骤是并行的,SQL SERVER通过这种方式可以让计算和 I/O 重叠进行,从而充分利用 CPU 和磁盘,从而提高性能。

  扫描计数:查询数据时对涉及到的表被访问次数或涉及到的索引的扫描次数。对于查询中不包括连接命令时,这一信息并不是十分有用,但如果查询中包含有一个或多个连接,则十分有用。
  一个循环外部的表的扫描计数值为1,但对于一个循环内的表而言,其值为循环的次数。可以想象得到,对于一个循环内的表而言,其扫描计数值越小,它所使用的资源越少,查询的性能也就越高。因此在调节一个带连接的查询的性能时,需要关注扫描计数的值,在进行调节时,注意观察它是增加还是减少了。
  逻辑读: 这是SET STATISTICS IO或SET STATISTICS TIME命令提供的最有用的数据。SQL Server在对任何数据进行操作前,必须首先从磁盘中读取数据所在的数据页或索引页,并把数据页或索引页存到数据缓冲区高速缓存中。
  逻辑读是指SQL Server为得到查询中的结果而必须从数据缓冲区高速缓存读取的页数。在执行查询时,SQL Server不会读取比实际需求多或少的数据, 因此,当在相同的数据集上执行同一个查询,得到的逻辑读的数字总是相同的。
  在每次执行同一查询时,这个数值是不会变化的。因此,在进行查询性能的调节时,这是一个可以用来衡量你的调节措施是否成功的一个很好的标准。
  在对查询的性能进行调节时,如果逻辑读值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果逻辑读值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。
  物理读:指的是,在执行真正的查询操作前,SQL Server必须从磁盘上向数据缓冲区高速缓存中读取它所需要的数据。在SQL Server开始执行查询前,它要作的第一件事就是检查它所需要的数据是否在数据缓冲区高速缓存中,如果在,就从中读取,如果不在,SQL Server必须首先将它需要的数据从磁盘上读到数据缓冲区高速缓存中。
  SQL Server在执行物理读时比执行逻辑读需要更多的服务器资源。因此,在理想情况下,我们应当尽量避免物理读操作。
  在对查询的性能进行调节时,可以忽略物理读而只专注于逻辑读。SQL Server在执行查询时所需要的物理读次数不可能通过性能调节而减少的。减少物理读的次数是DBA的一项重要工作,但它涉及到整个服务器性能的调节,而不仅仅是查询性能的调节。在进行查询性能调节时,我们不能控制数据缓冲区高速缓存的大小或服务器的忙碌程度以及完成查询所需要的数据是在数据缓冲区中还是在磁盘上,唯一我们能够控制的数据是得到查询结果所需要执行的逻辑读的次数。
  减少物理读次数、加快SQL Server运行速度的一种方式是确保服务器的物理内存足够多。
  预读:预读表示SQL Server在执行预读机制时从磁盘上读取的数据页或索引页。为了优化其性能,SQL Server数据引擎首先预测执行查询执行计划所需的数据和索引页,然后在查询实际使用这些页之前将它们读入缓冲区高速缓存。根据SQL Server对数据需求预测的准确程度,预读的数据页可能有用,也可能没用。与物理读一样,这个值在查询性能调节中也没有什么用处。

  注意:一个缓冲区就是一个 8KB 大小的内存页

二、分析

  SQL SERVER数据存储的方式:存储的最小单位为页(Page).每一页大小为8k,SQL SERVER对于页的读取是原子性,要么读完一页,要么完全不读,不会有中间状态。而页之间的数据组织结构为B树。所以SQL SERVER对于逻辑读,预读,和物理读的单位是页。

  SQL SERVER一页的总大小为:8K

页存储的数据为:8192字节-96字节(页头)-36字节(行偏移)=8060字节

所以每一页用于存储的实际大小为8060字节。

通过表属性→存储,看到这个表的数据空间为5.336M:

  

  可以通过公式大概推算出占用了多少页:

  5.336*1024*1024/8060(每页的数据容量)≈ 694 - 表中非数据占用的空间 ≈687(逻辑读取数)

  SQL SERVER查询执行的步骤如果从微观来看,那将会非常多。这里为了讲述逻辑读等概念,从比较高的抽象层次来看:

  

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

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

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

  示例中的“ 预读703次 ”即为估计的页数,可以通过这个DMV看到该数据:

SELECT page_count
FROM sys.dm_db_index_physical_stats(DB_ID('foodtrace_fwq'),OBJECT_ID('FoodCorp'),NULL,NULL,'sampled')

  

  当我们第一次查询完成后,再次进行查询时,所有请求的数据这时已经在缓存中,SQL SERVER这时只要对缓存进行读取就行了,也就是只用进行逻辑读。

  

逻辑读、物理读、预读的理解相关推荐

  1. Rocksdb 通过posix_advise 让内核减少在page_cache的预读

    文章目录 1. 问题排查 确认I/O完全/大多数来自于rocksdb 确认此时系统只使用了rocksdb的Get来读 确认每次系统调用下发读的请求大小 确认是否在内核发生了预读 2. 问题原因 内核预 ...

  2. [转]Linux内核的文件预读(readahead)

    编者按:Linux文件预读算法磁盘I/O性能的发展远远滞后于CPU和内存,因而成为现代计算机系统的一个主要瓶颈.预读可以有效的减少磁盘的寻道次数和应用程序的I/O等待时间,是改进磁盘读I/O性能的重要 ...

  3. Linux文件系统预读的情景分析

    本文系转发,分析Linux文件系统同步和异步的预读机制,有图有真相,比较形象. 预读可以提高CPU和硬盘工作的并行度,减小APP延迟. 主要阐述内核(linux-3.12)的文件系统预读及时的设计和实 ...

  4. MySQL -A不预读数据库信息(use dbname 更快)

    mysql数据库预读与不预读数据库信息(use dbname)-Reading table information for completion of table and column names   ...

  5. 理解SQL SERVER中的逻辑读,预读和物理读

    在我的上一篇关于SQL SERVER索引的博文,有圆友问道关于逻辑读,预读和物理读的概念.我觉的还是写一篇博文能把这个问题解释清楚. SQL SERVER数据存储的形式 在谈到几种不同的读取方式之前, ...

  6. SQL --理解SQL SERVER中的逻辑读,预读和物理读

    本文转载自:https://www.cnblogs.com/CareySon/archive/2011/12/23/2299127.html 理解SQL SERVER中的逻辑读,预读和物理读 SQL ...

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

    前言 本文涉及的内容均不是原创,是记录自己在学习IO.执行计划的过程中学习其他大牛的博客和心得并记录下来,之所以想写下来是为了记录自己在追溯的过程遇到的几个问题,并把这些问题弄清楚. 本章最后已贴出原 ...

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

    前言: 该文并不全是本人原创,里面的某些原理来自于CareySon. SQL SERVER数据存储的形式 要理解逻辑读.物理读.预读这三个概念,先要搞懂SQL Server的数据存储方式. SQL S ...

  9. [MS Sql Server术语解释]预读,逻辑读,物理读

    在MSSQL中使用 SET STATISTICS IO ON 打开IO统计功能之后,每次执行完一个查询就会在下面的[消息]面板中显示本次查询IO的统计信息. (0 行受影响) 表 'demo'.扫描计 ...

最新文章

  1. 【C++语法】回车与换行(vs2008)
  2. 网络营销外包浅析当前行业竞争压力之下网络营销外包公司如何应对?
  3. python上海培训哪里比较好-上海Python培训哪家强
  4. java切换系统输入法_java - 关于Android输入法切换的问题
  5. php7.2与php5.6共存,同域名下php5.6与7.2同时运行
  6. Spring Boot————AOP入门案例及切面优先级设置
  7. 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
  8. 软件工程相关书目之《大道至简》读后感
  9. java编写Linux文件共享,ubuntu下用samba实现windows与linux文件共享
  10. 如何从知网下载学位论文的PDF?
  11. 软件工程--螺旋模型详解
  12. BI解决方案分享:地产BI数据分析系统的建设
  13. android跳转QQ陌生人聊天或者加入QQ群
  14. 利用百度云存储制作外链mp3音乐地址
  15. LOCK is not allowed in stored procedures
  16. Android自定义View之滑杆内部带数字的SeekBar
  17. 吞吐量(TPS)、QPS、并发数、响应时间(RT)说明
  18. CSS深度(穿透)选择器
  19. 公司邮箱、公共邮箱、工作邮箱,常用什么邮箱?
  20. 数据结构:递归算法时间复杂度与空间复杂度计算方法

热门文章

  1. mysql做报表分析_mysqlreport解析
  2. redis没有bin目录_分布式缓存 Redis 集群搭建,这里一次性帮你搞定!
  3. 服务器用netstat卡_PHP安全:服务器端口安全
  4. 计算机211学校四川,四川省有哪些211大学?附排名
  5. 液压支架销轴力学计算分析研究_技术 | 篦冷机液压管路问题分析及改造措施
  6. mysql capi函数详解_技术分享|MySQLCAPI参数MYSQL_OPT_READ_TIMEOUT的一些行为分析
  7. php的数组key删除,php删除数组的key
  8. pucch的uci格式_LTE规范中关于DCI/PDCCH以及UCI/PUCCH写的比较模糊?
  9. 大班音乐机器人反思_幼儿园大班音乐律动教案《伦敦桥》含反思
  10. gitlab mergeRequest