理解SQL Server的SQL查询计划
2007-05-15 09:27:10 来源:WEB开发网核心提示: SEEK与SCAN第一件事是你需要在查询计划中区别SEEK和SCAN操作的不同,注意:一个简单但非常有用的规则是SEEK操作是有效率的,理解SQL Server的SQL查询计划(2),而SCAN操作即使不是非常差,其效率也不是很好,与前面的直接查询的查询计划很相似,下面两个范围查询可提供一
SEEK与SCAN
第一件事是你需要在查询计划中区别SEEK和SCAN操作的不同。
注意:一个简单但非常有用的规则是SEEK操作是有效率的,而SCAN操作即使不是非常差,其效率也不是很好。SEEK操作是直接的,或者至少是快速的,而SCAN操作需要对整个对象进行读取(表,聚集索引或非聚集索引)。因此,SCAN操作通常比SEEK要消耗更多的资源。如果你的查询计划仅是扫描操作,你就应该考虑调整你的查询了。
where子句在查询性能中能产生巨大的差异,如下面展示的:
Select *
From big_sales
Where stor_id=’6380’
StmtText
-----------------------------------------------------------------------------|--Clustered
Index Seek(OBJECT: ([pubs].[dbo].[big_sales].[UPKCL_big_sales])),
SEEK: ([big_sales].[stor_id]={@1} ORDERED FORWARD)
上面的查询是在聚集索引上执行SEEK而不是SCAN操作。这个SHOWPLAN确切的描述SEEK操作是基于stor_id并且结果是按照在索引中存储的顺序排序的。因为SQL Server支持索引的向前和向后滚动的性能是相同的,所以你可以在查询计划中看到ORDERED FORWARD 或ORDERED BACKWARD。这只是告诉你表或索引读取的方向。你甚至可以在ORDER BY子句中通过用ASC和DESC关键字操作这些行为。范围查询返回的查询计划,与前面的直接查询的查询计划很相似。下面两个范围查询可提供一些信息:
Select *
From big_sales
Where stor_id>=’7131’
StmtText
------------------------------------------------------------------------------|-Clustered
Index Seek(OBJECT: ([pubs].[dbo].[big_sales].[UPKCL_big_sales] ),
SEEK: ([big_sales].[stor_id]>=’7131’) ORDER FORWARD
上面的查询看起来很象以前的例子,除了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表' (数...
赞助商链接