注:以下的试验在多人共享的开发测试服务器上也可以进行,因为实际上可以分别看到某个表所占用的内存情况。但为了方便,笔者在做此试验时,在一个单独的、确认没有其它并发任务的数据库上进行,因此所看到的内存变化正是每一次所执行的SQL语句引起的。
我们首先来看一个简单的实例。创建下表:
以下是引用片段: Create Table P_User ( UserMobileStatus int NOT NULL, MobileNo int NOT NULL, LastOpTime DateTime Not NULL ) |
然后为该表插入一定的数据:
以下是引用片段: Declare @i int Set @i=28000 WHILE @i<29000 BEGIN Insert Into P_User Select @i % 2,@i,GetUTCDate() Set @i=@i+1 END |
然后我们在查询分析器中首先执行:
以下是引用片段: Set Statistics IO ON |
并按下Ctrl+M以显示实际的执行计划。
此时,可以开始进行我们的试验了。为了准确观察每一次SQL语句变化情况,在执行第一条SQL语句以前,我们首先清空SQL Server所占用的数据内存:
以下是引用片段: CHECKPOINT GO DBCC DROPCLEANBUFFERS |
这将清空SQL Server所占用的数据缓冲区(此语句在生产服务器上慎用,因为将导致一段时间内后续的SQL语句执行变慢)。
4.2 执行高选择性选取
执行如下的SQL语句:
以下是引用片段: Select * From P_Order A Inner merge JOIN P_User B ON A.MobileNo=B.MobileNo Where A.MobileNo=28913 |
在两个表都没有任何索引情况下,两张表都将执行全表扫描。要读入所有的数据页到内存。总体逻辑读取决于两表的数据页数。
在一个表有聚集索引或者非聚集索引情况下,该表将执行Index Seek,另一个表将出现全表扫描。内存数据缓冲区中,将有一张表只读入最终数据所在的数据页、一张表读入全部数据页。逻辑读数取决于表在联接中的秩序、以及无索引表的数据页数。