SQL Server中STATISTICS IO物理读和逻辑读的误区

大家知道,SQL Server中可以利用下面命令查看某个语句读写IO的情况

SET STATISTICS IO ON

那么这个命令的结果显示的物理读、逻辑读的IO单位大小是多少,比如结果显示有

物理读取 1 次

是代表 对硬盘做了1次物理IO吗?


在回答这个问题之前,需要先普及几个常识

在一般默认情况下

Windows的内存分页大小单位是4KB

数据库的最小读写单位是 8K页面

Windows操作系统的NTFS文件系统最小读写单位(分配单元/簇)是 4KB

机械硬盘的的最小读写单位(逻辑扇区和物理扇区)是512字节

高级格式化:操作系统对文件系统盘符进行格式化,规划每分配单元/簇大小,默认4KB

低级格式化:存储厂家对物理存储硬件做的低级格式化,例如机械硬盘,规划每扇区大小,通常512字节

为什么存在磁盘块/簇/分配单元?

读取方便:由于扇区的数量比较小,数目众多在寻址时比较困难,所以操作系统就将相邻的扇区组合在一起,形成一个块,再对块进行整体的操作,

分离对底层的依赖,操作系统忽略对底层物理存储结构的设计,通过虚拟出来磁盘块的概念,文件系统就是操作系统的一部分,所以文件系统操作文件的最小单位是块/簇/分配单元

这个磁盘块在Linux的ext4文件系统中称为block,在Windows的NTFS文件系统中称为分配单元或簇

什么是内存分页?

操作系统经常与内存和硬盘这两种存储设备进行通信,类似于“块”的概念,都需要一种虚拟的基本单位。所以,与内存操作,是虚拟一个页的概念来作为最小单位。与硬盘打交道,就是以块为最小单位

固态硬盘因为没有扇区概念,用的是块/页,一个块/页一般是4KB,so固态硬盘暂且不讨论

先说结论,实际上STATISTICS IO 中物理读和逻辑读的统计对象自始至终都是数据库8K页面,比如,逻辑读1次, 物理读1次,实际上都是按8KB页为单位,是SQL Server这个软件的统计方式

这样就会造成误解,产生疑问

如果物理读为1次,那么数据库对磁盘是做了一次读写操作一次IO,对吗?

如果逻辑读为1次,那么数据库在内存中是读写了一个内存页一次IO,对吗?

实际情况是怎样的呢?

对于物理读情况

SQL Server是运行在Windows系统上的一个软件,那么这个软件在文件系统上存储数据依然按照NTFS文件系统的规则,存储一个8K的页面需要占用2个分配单元

可以用winhex这个软件,按8K大小查看数据库的mdf文件可以查看到完整的一个数据库页面数据

对于文件系统,读写一个数据库8KB页面需要读写2个分配单元 也就是2个文件系统IO

在机械硬盘里面,文件系统的一个4KB分配单元写入到机械硬盘里,需要读写8个扇区,也就是8个硬盘IO,而1个数据库8KB页面写入到机械硬盘里,就需要读写16个扇区,也就是实际写入一个数据库页面需要16个硬盘IO

然后这里会出现一些问题,如果系统故障或硬件故障,就有可能出现一个数据库页面写入存储硬件不完整情况,比如16个硬盘IO才能写入完整一个8KB页面,而如果在写入第10个IO的时候发生系统崩溃或硬件崩溃,只写入了5KB页面数据到硬盘,这时候数据库数据就已经不完整了,然后各家数据库厂商才开发【页面写入完整性检测机制】,例如

MySQL InnoDB的Double Write机制(innodb_doublewrite = 1) + page checksum

MSSQL的PAGE校验机制

注意:即使是用固态硬盘,也请不要关闭页面完整性检测功能!

只有在数据库页面、文件系统分配单元、机械硬盘扇区的大小一致的情况下

就是说,数据库文件系统存储设备的最小读写单位大小一样的情况下,也就是所谓的【对齐】,才能关闭页面完整性检测功能,这个时候可以获得最大性能

某些文件系统、存储设备所谓的声称支持【原子写】,请各位擦亮眼睛^_^,检查是否真的完整支持,对于某些情况,确实是支持真正原子写,例如

1、数据库使用裸设备,这样就不需要文件系统

2、以宝存PCIE闪存为例子,其Nand Flash的最小写单位是page,目前Nand Flash 的page大小是32kb,这个基本上都是大于大部分数据库通用的block size或page size,32kb可以存放4个MSSQL页面(非广告)

对于逻辑读情况

Windows的内存分页大小单位是4KB,一个数据库页面8KB,那么读写一个内存中的数据库页面实际上需要读写2个内存分页

在内存里,读写一个数据库8KB页面需要读写2个内存分页, 也就是2个内存IO

然后内存中8KB数据库页跟文件系统中的8KB数据库页是一一对应的,不然的话,利用B+树索引结构和二分查找法查找数据也无从谈起


总结

对于文件系统,读写一个数据库8KB页面需要读写2个分配单元 也就是2个文件系统IO

对于机械硬盘,读写一个数据库8KB页面需要读写16个硬盘扇区 也就是16个硬盘IO

对于内存,读写一个数据库8KB页面需要读写2个内存分页 也就是2个内存IO

SQL Server只是跑在Windows操作系统上的一个软件,它无法知道也不需知道它所在文件系统的最小读写单位,也无法知道也不需知道存储设备的最小读写单位,

实际上操作系统从文件系统中读取8KB页面数据喂给数据库,数据库收到之后STATISTICS IO 就统计物理读为 1,至于逻辑读也是同理

最最后,放一张图,做的比较丑

参考文章
http://www.dostor.com/article/111637957.html
https://blog.csdn.net/qq_34228570/article/details/80209748

 

本文版权归作者所有,未经作者同意不得转载。

SQL Server中STATISTICS IO物理读和逻辑读的误区的更多相关文章

  1. 如何识别SQL Server中的IO瓶颈

    原文:如何识别SQL Server中的IO瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2329/how-to-identify-io-bottlene ...

  2. SQL Server中与IO相关的等待类型:IO_COMPLETION和PAGEIOLATCH_*

    一个大的SQL语句操作,执行计划中包含了一个merge join操作,观察到SQL长时间处于IO_COMPLETION等待状态,如果是读取相关的表的数据,服务器应该全力为其服务,但是服务器的物理IO又 ...

  3. SQL Server中数据库文件的存放方式,文件和文件组

    原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html   SQL Server中数据库文件的存放方式,文件和文件组 ...

  4. SQL Server中数据库文件的存放方式,文件和文件组 (转载)

    简介 在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SERVER通过管理逻辑上的文件组的方式来管理文件.理解文件和文 ...

  5. SQL Server中一个隐性的IO性能杀手-Forwarded record

    简介     最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动.本篇文章分享什么是forwarded record,并从原理上谈一 ...

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

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  7. SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

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

    简介 SQL Server中的事务日志无疑是SQL Server中最重要的部分之一.因为SQL SERVER利用事务日志来确保持久性(Durability)和事务回滚(Rollback).从而还部分确 ...

  9. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

随机推荐

  1. SpringBoot图文教程14—SpringBoot集成EasyExcel「上」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  2. 一套代码同时支持.NET Framework和.NET Core

    转自:https://www.cnblogs.com/tianqing/p/11614303.html 在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET C ...

  3. 爬虫之requestsku

    想用selenium实现B站自动登录已经点赞等功能,看到如何解决滑动解锁有关爬虫的内容,便开始学习爬虫,没过多久又想把记录自己生活的网站做起来,朋友便推荐了layui框架倒腾了一晚上自我觉得是做后台系 ...

  4. web自动化原理

    在说原理之前我想说下我所理解的selenium: (1).支持多语言,多平台,多浏览器 (2).它是一个工具包 (3).提供所有的网页操作api,是一个功能库 通过selenium来实现web自动化, ...

  5. 使用JDBC工具类模拟登陆验证-Java(新手)

    模拟登陆验证: package JdbcDome; import java.sql.Connection; import java.sql.PreparedStatement; import java ...

  6. search(3)- elastic4s-QueryDSL

    elastic4s是elasticsearch一个第三方开发的scala语言终端工具库(Elastic4s is a concise, idiomatic, reactive, type safe S ...

  7. Python——项目-小游戏2-动画绘制

    实现游戏循环还有事件的监听 在上一讲中 你需要完成这样的这样的效果, 如果你还没有完成,请不要继续往下阅读!!切记切记切记.,重要的事情说三遍 我们来看一下什么是游戏循环 所谓的游戏循环很好的理解 就 ...

  8. JavaScript(8)--- 闭包

    JavaScript(8)--- 闭包 理解闭包 我的理解是:闭包就是能够读取其他函数内部变量的函数.由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以简单这样理解 &q ...

  9. DIV常用属性大全

    目录 一.属性列表 二.常用属性 三.一些特殊效果 四.定位和控制 一.属性列表 color : #999999 文字颜色 font-family : 宋体 文字字型 font-size : 10pt ...

  10. nmap加载nse脚本在内网渗透中的使用-上

    转载自:https://mp.weixin.qq.com/s/zEgHxJEOfaiYVZYmg7NnXA? 大多数情况下,大家都认为nmap只是一个扫描工具,而不把当成是一个渗透工具.nmap集成了 ...