【发布时间】:2009-01-22 11:32:26
【问题描述】:
TOP 和 SET ROWCOUNT 之间的性能是否存在差异,或者它们只是以相同的方式执行?
【问题讨论】:
标签: sql performance
TOP 和 SET ROWCOUNT 之间的性能是否存在差异,或者它们只是以相同的方式执行?
【问题讨论】:
标签: sql performance
是的,在功能上它们是一样的。据我所知,两者之间没有显着的性能差异。
需要注意的一件事是,一旦您拥有 set rowcount,这将在连接的整个生命周期内持续存在,因此请确保在完成后将其重置为 0。
SET ROWCOUNT 的范围仅适用于当前过程。这包括当前过程调用的过程。它还包括通过EXEC 或SP_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 行
【讨论】:
BEGIN...END 只是一个复合语句。从来没有认为它也定义了一个范围。也许“全局”BEGIN...END 是一种特殊情况,它用于明确指定编程对象主体的开始和结束。但即便如此,我会说,它只是将编程对象的范围可视化,而不是定义自己的范围。
根据 BOL,关于性能的更多说明:
作为 SELECT 语句的一部分,查询优化器可以在查询优化期间考虑 TOP 或 FETCH 子句中的表达式值。因为 SET ROWCOUNT 在执行查询的语句之外使用,所以不能在查询计划中考虑其值。
意味着这些实际上可能存在性能差异。
【讨论】: