TOP与SET ROWCOUNT

时间:2009-01-22 11:32:27

标签: sql performance

TOPSET ROWCOUNT之间的效果是否存在差异,或者它们是否以同样的方式执行?

2 个答案:

答案 0 :(得分:10)

是的,功能上它们是一回事。据我所知,两者之间没有明显的性能差异。

有一点需要注意的是,一旦你有set rowcount,这将在连接的生命周期中持续存在,因此请确保在完成连接后将其重置为0

<小时/>

编辑(马丁的评论)

SET ROWCOUNT的范围仅适用于当前程序。这包括当前程序调用的过程。它还包括通过EXECSP_EXECUTESQL执行的动态SQL,因为它们被视为“子”范围。

请注意,SET ROWCOUNT位于BEGIN/END范围内,但超出了此范围。

create proc test1
as
begin
    begin
    set rowcount 100
    end
    exec ('select top 101 * from master..spt_values')
end
GO

exec test1
select top 102 * from master..spt_values

结果= 100行,然后是102行

答案 1 :(得分:4)

根据BOL,还有一个关于性能的说明:

  

作为SELECT语句的一部分,查询优化器可以在查询优化期间考虑TOP或FETCH子句中的表达式值。由于SET ROWCOUNT在执行查询的语句之外使用,因此无法在查询计划中考虑其值。

Article on BOL

意味着这些实际上可能存在性能差异。