AutoCAD 3DMAX C语言 Pro/E UG JAVA编程 PHP编程 Maya动画 Matlab应用 Android
Photoshop Word Excel flash VB编程 VC编程 Coreldraw SolidWorks A Designer Unity3D
 首页 > SQL Server

SQL Server执行SQL语句时内存占用特点

51自学网 http://www.wanshiok.com

 

  测试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语句

 
 

上一篇:SQL Server与Oracle、DB2三种数据库比较  下一篇:剖析SQL Server2005 SQLCLR代码安全性