SQL Server SQL语句调优技巧

来源:铸锐论坛 作者:佚名 2007-09-24 出处:pcdog.com

sql server  存储过程  数据库  
上一页 1 2 3 4 

TOP 和 SET ROWCOUNT

SELECT 语句中的TOP子句限制单个查询返回的行数,而SET ROWCOUNT限制所有后续查询影响的行数。在很多编程任务中这些命令提供了高效率。

SET ROWCOUNT在SELECT,INSERT,UPDATE OR DELETE语句中设置可以被影响的最大行数。这些设置在命令执行时马上生效并且只影响当前的会话。为了移除这个限制执行SET ROWCOUNT 0。

一些实际的任务用TOP or SET ROWCOUNT比用标准的SQL命令对编程是更有效率的。让我们在几个例子中证明:

TOP n

在几乎所有的数据库中最流行的一个查询是请求一个列表中的前N项。在 pubs数据库案例中,我们可以查找销售最好CD的前五项。比较用TOP,SET ROWCOUNT和使用ANSI SQL的三种方案。

纯 ANSI SQL:

Select title,ytd_sales

From titles a

Where (select count(*)

From titles b

Where b.ytd_sales>a.ytd_sales

)<5

Order by ytd_sales DESC

这个纯ANSI SQL方案执行一个效率可能很低的关联子查询,特别的在这个例子中,在ytd_sales上没有索引支持。另外,这个纯的标准SQL命令没有过滤掉在ytd_sales的空值,也没有区别多个CD间有关联的情况。

使用 SET ROWCOUNT:

SET ROWCOUNT 5

SELECT title, ytd_sales

FROM titles

ORDER BY ytd_sales DESC

SET ROWCOUNT 0

使用 TOP n:

SELECT TOP 5 title, ytd_sales

FROM titles

ORDER BY ytd_sales DESC

第二个方案使用SET ROWCOUNT来停止SELECT查询,而第三个方案是当它找到前五行时用TOP n来停止。在这种情况下,在获得结果之前我们也要有一个ORDER BY子句强制对整个表进行排序。两个查询的查询计划实际上是一样的。然而,TOP优于SET ROWCOUNT的关键点是SET必须处理ORDER BY子句所需的工作表,而TOP 不用。

在一个大表上,我们可以在ytd_sales上创建一个索引以避免排序。查询将使用该索引找到前5行并停止。与第一个方案相比较,其扫描了整个表,并对每一行执行了一个关联子查询。在小表上,性能的差异是很小的。但是在一个大表上,第一个方案的处理时间可能是数个小时,而后两个方法是数秒。

当确定查询需要时,请考虑是否只需要其中几行,如果是,使用TOP子句将节约大量时间。


更多内容请看PCdog.com--Office技巧专区  SQL Server专题
上一页 1 2 3 4 
上一篇:实例:NStarfaiNet的SQL XML文件示范
下一篇:SQL Server数据库中使用触发器经验谈