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

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

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

SET STATISTICS IO ON

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

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

物理读取 1 次

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

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

在一般默认情况下

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

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

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

机械硬盘的逻辑扇区:512字节,整个硬盘暴露给操作系统的扇区,一般跟物理扇区的大小是一样的,保持对齐,操作系统将分配单元的读写请求划分为多个512字节大小,为了适应逻辑扇区的大小

机械硬盘的物理扇区:512字节 ,旧磁盘是512字节,也就是硬盘里面每个磁碟真正的读写扇区,新磁盘(固态硬盘的物理扇区和逻辑扇区都是为了兼容机械硬盘模拟出来的,固态硬盘实际用的是块/页)是4KB

机械硬盘的原生512 native对齐:逻辑扇区、物理扇区的大小都是一样的,也叫512n,如果逻辑扇区和物理扇区是不一样的,那么就是512e,如果是固态硬盘的native对齐就是4Kn

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

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

前提:本文阐述的所有场景都是针对《机械硬盘的原生512 native对齐》的前提下,并且是非虚拟化环境下,虚拟化环境会多了一层VMFS bloc更加复杂,敬请注意!

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

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

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

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

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

什么是内存分页?

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

固态硬盘因为没有扇区概念,用的是块/页,一个块/页一般是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校验机制

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

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

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

就是说, 数据库文件系统存储设备的最小读写单位大小一样的情况下,也就是所谓的【对齐】,更严谨的应该是数据库、文件系统、(存储设备的逻辑扇区、存储设备的物理扇区,512n或4Kn)的最小读写单位大小一样

才能关闭页面完整性检测功能,这个时候可以获得最大性能

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

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,至于逻辑读也是同理

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

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

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

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

Original: https://www.cnblogs.com/lyhabc/p/12670802.html
Author: 桦仔
Title: SQL Server中STATISTICS IO物理读和逻辑读的误区

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590801/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 快速入门上手Markdown

    第一次接触 Markdown是写代码初期看很多大佬的 github,他们的项目一定会有一份文件叫 Readme.md的文件他们由一些简单美观的符号和汉字字母组成,编译之后成为一篇简…

    数据库 2023年6月11日
    088
  • 记录一次数据库CPU被打满的排查过程

    1 前言 近期随着数据量的增长,数据库CPU使用率100%报警频繁起来。第一个想到的就是慢Sql,我们对未合理运用索引的表加入索引后,问题依然没有得到解决,深入排查时,发现在 or…

    数据库 2023年5月24日
    0110
  • mysql语法使用详细代码版

    mysql 1.什么是数据库 数据库:(DB,DataBase)作用:用来存储数据,管理数据。Txt,Excel,word是在数据库出现之前存储数据的。概念:数据仓库,安装在操作系…

    数据库 2023年5月24日
    080
  • 【学习路线】– 凡人修仙,升级打怪路线图(留给2022的自己!发财加薪)

    B站真是程序员的福利站,不仅有鱼皮、狂神、水哥等等一系列的大佬,也有《凡人修仙传》这样的励志动漫,其实编程也是一样,我们也需要道友的支持、分享和协助,一路升级打怪。。。经验UpUp…

    数据库 2023年6月6日
    092
  • mysql查询优化

    1.count优化 a语句当行数超过11行的时候需要扫描的行数比b语句要多, b语句扫描了6行,此种情况下,b语句比a语句更有效率。 当没有where语句的时候直接select c…

    数据库 2023年5月24日
    083
  • JavaScript进阶内容——BOM详解

    JavaScript进阶内容——BOM详解 在上一篇文章中我们学习了DOM,接下来让我们先通过和DOM的对比来简单了解一下BOM 首先我们先来复习一下DOM: 文档对象模型 DOM…

    数据库 2023年6月14日
    0152
  • 事务

    事务 *事务的简介 事务是一组操作的集合,这是一个不可分割的工作单元。事务将向整个系统提交或取消操作请求。这些操作只能同时成功和失败。 [En] A transaction is …

    数据库 2023年5月24日
    0112
  • Jmeter操作ES

    JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎(简称es…

    数据库 2023年6月14日
    093
  • centos下安装myrocksdb

    承接上一篇,https://www.cnblogs.com/lunyu/p/10190364.html 。编译安装myrocks的整个过程,特别是第2步和第7步,让人冗长难耐。因此…

    数据库 2023年6月14日
    0112
  • Mybatis-Plus初步上手!!

    1.简介 1.1、特性 2.快速开始 3.配置日志 4.CRUD拓展 4.1、插入 4.2、更新 4.3、查询 4.4、删除 5.性能分析插件 6.条件构造器Wrapper 7.代…

    数据库 2023年6月16日
    081
  • mysql

    mysql 1.1数据库 关系型数据库:数据存储在硬盘上 [En] Relational database: the data is stored in the hard disk…

    数据库 2023年5月24日
    092
  • 百万数据 mysql count(*)优化

    Original: https://www.cnblogs.com/sunshine-blast/p/16272978.htmlAuthor: 魁哥2020Title: 百万数据 …

    数据库 2023年5月24日
    080
  • 在laravel中使用pipeline管道提升redis读写速度

    可能有些小伙伴使用redis读写数据在需要循环使用的场景会发现效率并不是很高 于是我分享一个pipeline管道方法 我们这里用12万条数据做测试,首先来试试写入操作,看看用常规方…

    数据库 2023年6月14日
    0100
  • python threading args参数报错must be an iterable, not int,解决方法

    错误代码: thread.append(threading.Thread(target=as_same_time, args=(0))) 分析: 因为as_same_time方法只…

    数据库 2023年6月11日
    078
  • 【StoneDB Class】入门第一课:数据库知识科普

    在没有出现数据库之前,数据存储在文本中,这种数据存储方式不管是管理还是查询,效率都是极其低下的,数据之间没有关联性。到了1970年,IBM研究员 E.F.Codd 发表了论文&#8…

    数据库 2023年5月24日
    086
  • MySQL高可用架构-MMM、MHA、MGR、PXC、分库分表(补总结)

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    数据库 2023年5月24日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球