SQL Server执行SQL语句时内存占用特点
2007-11-11 11:36:09 来源:WEB开发网核心提示: ·SQL高手篇:精妙SQL语句介绍·一个sql语句,包含有几乎所有标准查询·经验分享交流:常用SQL语句技法·SQL语句和存储过程 查询语句的流程控·实战SQL语句收集(不断更新中--)·SQL语句性能优化--LECCO SQL Ex
- ·SQL高手篇:精妙SQL语句介绍
·一个sql语句,包含有几乎所有标准查询
·经验分享交流:常用SQL语句技法
·SQL语句和存储过程 查询语句的流程控
·实战SQL语句收集(不断更新中--)
·SQL语句性能优化--LECCO SQL Expert
·查询同一表内多字段同时重复记录的SQL
·数据库人员手边系列:SQL语句导入导出
·得出SQL语句的执行时间的方法
·使用一条SQL语句删除表中重复记录
3.1 执行全表选取或者低选择性选取
如果将表中同一字段的聚集索引换成非聚集索引,则可以看到如下特点:
执行全表扫描将和没有任何索引的情况相似,将读取所有的数据页到内存。此时,sql server(WINDOWS平台上强大的数据库平台)的查询引擎实际上无法使用非聚集索引。
3.2 执行高选择性选取
将只读取最终数据所在的页到内存。通过查询计划可以看到,sql server(WINDOWS平台上强大的数据库平台)在非聚集索引上使用INDEX SEEK,然后通过lookup 得到数据实际所在行(索引覆盖情况下例外,因为不需要定位到实际数据行)。
测试4:执行Nested Loop Join
在进行测试前,我们先准备另外一张表和数据。
以下是引用片段: Create Table P_Order ( UserStatus int NOT NULL, MobileNo int NOT NULL, Sid int Not NULL, LastSubTime DateTime ) |
插入数据:
以下是引用片段: 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(WINDOWS平台上强大的数据库平台)不会执行Loop Join。因此,使用了强制性的联接提示。
在两个表都没有任何索引的情况下,可以看到:
两个表所有的数据页都将被加载到内存。逻辑读取代价高达6万多次——对于P_Order表中的每一条记录,都将在P_User表中进行遍历。
在其中一个表有聚集索引情况下,尽管逻辑读取相比刚才的6万多次已经大大下降,但仍然达到2万次。而且联接的次序对查询性能影响很大。因为其实际执行的是将SQL语句中前面的表作为联接的外部输入,而后面的表作为联接的内部输入。
在两个表都有聚集索引情况下,相比较而言,逻辑读仍然达到数千次(取决于最终输出的数据大小),但相比较已经大大改善。而且表中的数据只有最终需要输出的部分才会被读入内存Buffer中。
- ››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表' (数...
更多精彩
赞助商链接