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

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

原文链接:https://www.cnblogs.com/lyhabc/p/12670802.html

本站声明:网站内容来源于网络,若有侵权,请联系我们,我们将及时处理。

mysql物理读和逻辑读,SQL Server中STATISTICS IO物理读和逻辑读的误区相关推荐

  1. 如何在SQL Server中自动进行表分区

    In this article, we will demonstrate specific ways to automate table partitioning in SQL Server. Thi ...

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

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

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

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

  4. sql server重命名_在Linux上SQL Server中重命名逻辑和物理文件名

    sql server重命名 Each database in SQL Server contains at least two files i.e. Data file (*.mdf) and log ...

  5. sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段

    在Oracle.MySQL.MS SQL Server中创建自动增长字段 好吧,今天面试有道题,要各个数据库怎么建立自增长字段,顺便复习一下吧,最近面试很多数据库问题... 一:Oracle Orac ...

  6. Sql Server中实现Mysql中的group_concat函数效果

    Sql Server中实现Mysql中的group_concat函数效果 SELECT oi.*, stuff((select ','+convert(varchar(25), GuestName) ...

  7. sql2008能否打开mysql数据库_mysql数据库数据能不能导入到sql server中

    点"测试"按钮确认你的链接是正确的. Press the "Test" button to ensure your connection settings ar ...

  8. mysql 有newid()_MySQL中,有无GUID函数?就像SQL Server中的newid()解决方法

    mysql中,有无GUID函数?就像SQL Server中的newid() 如题! 有无直接返回GUID唯一标识的函数? ------解决方案-------------------- 函数 UUID( ...

  9. 【Docker】安装Presto连接Hive、mysql、oracle、postgresql、SQL server等7种类型数据库

    目录 1.简介 2.下载安装 1)下载镜像 2)下载presto客户端jar文件 3)将hadoop配置拷贝到容器 4)新增hive.properties配置文件 5)重启容器(在linux命令行下) ...

最新文章

  1. 优化算法笔记|灰狼算法理解及Python实现
  2. STL之双向循环链表(List)的内部关系
  3. 粒子运动模拟 - Verlet积分算法简介
  4. 60-150-044-使用-Sink-Flink自定义RetractStreamTableSink
  5. 【leveldb】资料
  6. 探秘联想台北研发中心 扒一扒system x是如何炼成的?
  7. web访问linux创建目录权限设置,centos7下新建一个用户并限制访问目录
  8. java 生产mdb_Java生成mdb文件[MS Access文件]
  9. [自制]python批量压缩图像
  10. 计算机相关国内外文献,计算机外文文献
  11. 第一节计算机课开场白,老师第一节课的开场白
  12. 第八章 VAR模型与脉冲响应
  13. 鹅厂开源框架tars之基础组件
  14. 机器学习数据的预处理
  15. centos 7.5 内核升级
  16. 清除pycharm残留文件
  17. Unix和Linux有什么区别? 通俗解释
  18. 新概念c语言能力教程答案,新概念c语言能力教程
  19. 计算机无法识别硬盘怎么办,硬盘电脑不识别怎么办?硬盘数据怎么恢复?
  20. 机器学习考点---过拟合与欠拟合、CNN原理......

热门文章

  1. win8改win7笔记
  2. Hibernate二级缓存的使用
  3. ubuntu 10.04 安装 pyquery
  4. 软件测试面试问答大全(2)
  5. vector机器人 WHAT DO I USE THE VECTOR APP FOR? 我使用 VECTOR 应用程序做什么?
  6. cpu meltdown 熔断 漏洞 突破内存独立性限制 简介
  7. linux c 线程属性 pthread_attr_t 简介
  8. linux bash shell 常用快捷键
  9. netcat nc端口监听 反向连接中断问题
  10. linux 内核 netfilter 网络过滤模块 (5)-iptables