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,另一个表将出现全表扫描。内存数据缓冲区中,将有一张表只读入最终数据所在的数据页、一张表读入全部数据页。逻辑读数取决于表在联接中的秩序、以及无索引表的数据页数。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接