测试1:在没有索引的表上执行SQL语句 1.1 执行全表选取或者低选择性选取 Select * From P_User 从SQL执行计划可以看到,由于此时表中没有任何索引,因此将产生Table Scan。而IO统计结果如下: (1000 row(s) affected) 表'P_User'。扫描计数1,逻辑读取4 次,物理读取4 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。 我们看一下数据库内存中的情况。 首先查询到我们所操作database的database_id: 以下是引用片段: Select database_id From sys.databases Where name='TestGDB' |
然后使用该database_id从表中查看内存情况: 以下是引用片段: SELECT * FROM sys.dm_os_buffer_descriptors bd WHERE database_id=5 order by allocation_unit_id,page_id |
得到结果如下: 得到的结果中可以看到,除了必要的管理页(一个PFS_Page和一个IAM_Page)外,内存中总共出现了4个Data_Page页。这和刚才IO统计中看到的结果:逻辑读为4,物理读为4相同。由于是全表读取,表明P_User表全部数据所占用的数据页数也正是4,将这4个数据页的row_count数加起来也可以验证其总数据行=1000。 在上例中,如果不清空数据缓冲区,再执行一遍SQL,可以看到内存毫无变化,而逻辑读也不变,只是物理读变为0,因为已经不需要再从磁盘读入数据。 1.2 执行高选择性选取 另外,在没有索引的情况下,如果将上例修改为: 以下是引用片段: Select Top 1 * From P_Order 或者Select * From P_Order Where MobileNo=28502 |
可以看到,系统同样要读取全部的数据页到内存。 如果使用Select Top 1 * From P_Order Where MobileNo=28502这样的选取方式,有可能会出现只读取部分数据页到内存的情况。但由于在没有索引情况下,数据实际上是无序存放在堆上,所以结果很不稳定,也有可能发生读取所有的数据页到内存。 测试2:建立聚集索引情况下,执行SQL语句  
2/2 首页 上一页 1 2 |