WEB开发网
开发学院数据库MSSQL Server SQL Server执行部分语句的内存代价 阅读

SQL Server执行部分语句的内存代价

 2007-08-03 09:46:46 来源:WEB开发网   
核心提示: Declare @i intSet @i=20000WHILE @i<30000BEGINInsert Into P_OrderSelect @i % 2,@i,@i-19999,GetUTCDate()set @i=@i+1END可以看到,在执行全表扫描情况下,SQL Server
Declare @i int
Set @i=20000
WHILE @i<30000
BEGIN
  Insert Into P_Order
  Select @i % 2,@i,@i-19999,GetUTCDate()
  set @i=@i+1
END

可以看到,在执行全表扫描情况下,该表10000条数据总共占用38个内存数据页。

4.1  执行全表选取或者低选择性选取Select * From P_Order A
Inner Loop JOIN P_User B ON A.MobileNo=B.MobileNo

对于此种高选择性选择,默认情况下SQL Server不会执行Loop Join。因此,使用了强制性的联接提示。

在两个表都没有任何索引的情况下,可以看到:

两个表所有的数据页都将被加载到内存。逻辑读取代价高达6万多次——对于P_Order表中的每一条记录,都将在P_User表中进行遍历。

在其中一个表有聚集索引情况下,尽管逻辑读取相比刚才的6万多次已经大大下降,但仍然达到2万次。而且联接的次序对查询性能影响很大。因为其实际执行的是将SQL语句中前面的表作为联接的外部输入,而后面的表作为联接的内部输入。

在两个表都有聚集索引情况下,相比较而言,逻辑读仍然达到数千次(取决于最终输出的数据大小),但相比较已经大大改善。而且表中的数据只有最终需要输出的部分才会被读入内存Buffer中。

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,另一个表将出现全表扫描。内存数据缓冲区中,将有一张表只读入最终数据所在的数据页、一张表读入全部数据页。逻辑读数取决于表在联接中的秩序、以及无索引表的数据页数。

上一页  1 2 3 4 5 6  下一页

Tags:SQL Server 执行

编辑录入:coldstar [复制链接] [打 印]
赞助商链接