SQL Server逻辑读、预读和物理读
时间:2022-03-14 09:58
上表的大小是17.406M。
每一页存储的数据是:8K=8192字节-96字节(页头)-36字节(行偏移)= 8060字节。
17.406*1024*1024 / 8060 ≈ 2 264
另外表中还有一些非数据占用的空间,因此上式的结果约等于逻辑读次数。
基本上,逻辑读、物理读、预读都等于是扫描了多少个页。
(图是CareySon大哥的)通过上图来讲解各种读:
当SQL Server执行一个查询语句时,SQL Serer会开始第一步,生成查询计划,同时用估计的数据去磁盘读取数据(预读),这两个第一步是并行的。SQL Server通过这种方式来提高查询性能。
查询计划生成好了以后去缓存读取数据,当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读),然后从缓存中取出所有数据(逻辑读)。
估计的页数可以通过DMV看到
SELECT page_count FROM sys.dm_db_index_physical_stats (DB_ID(‘TestDataCenter‘),OBJECT_ID(‘Person‘),NULL,NULL,‘sampled‘)
显示结果如下:
SQL Server就是根据这个东西进行预读。
如果此时我们再执行上面的查询语句:
SELECT * FROM Person --查询语句
看到消息如下:
(147517 行受影响) 表 ‘Person‘。扫描计数 1,逻辑读取 2237 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 (1 行受影响)
为什么这次全部都是逻辑读呢。因为刚才读过一次,数据全部都已经在缓存当中了,只需要从缓存中读就可以了,不需要再读取硬盘。
本文学习自: