mysql 逻辑读_SQL Server逻辑读、预读和物理读

SQL Server数据存储的形式

预读:用估计信息,去硬盘读取数据到缓存。预读100次,也就是估计将要从硬盘中读取了100页数据到缓存。

物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘。物理读10页,从硬盘中读取10页数据到缓存。

逻辑读:从缓存中取出所有数据。逻辑读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 行受影响)

0788028ec4e7558617d4fcd0c2374988.png

上表的大小是17.406M。

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

17.406*1024*1024 / 8060 ≈ 2 264

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

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

从执行顺序上理解各种读

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

42ea9439fa9de3d40495bb99a38b90c4.png(图是CareySon大哥的)

通过上图来讲解各种读:

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

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

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

SELECTpage_countFROMsys.dm_db_index_physical_stats

(DB_ID('TestDataCenter'),OBJECT_ID('Person'),NULL,NULL,'sampled')

显示结果如下:

2764b96c4048a81773e2d5cb6aea6a65.png

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

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

SELECT * FROM Person --查询语句

看到消息如下:

(147517行受影响)

表'Person'。扫描计数 1,逻辑读取 2237 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0次。

(1 行受影响)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值