性能之间是否存在差异? TOP
和 SET ROWCOUNT
或者他们只是以同样的方式执行?
性能之间是否存在差异? TOP
和 SET ROWCOUNT
或者他们只是以同样的方式执行?
是的,功能上他们是一回事。据我所知,两者之间没有明显的性能差异。
有一点需要注意的是,一旦你有了 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行
是的,功能上他们是一回事。据我所知,两者之间没有明显的性能差异。
有一点需要注意的是,一旦你有了 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行
据BOL称,还有一个关于性能的说明:
作为SELECT语句的一部分,查询优化器可以在查询优化期间考虑TOP或FETCH子句中的表达式的值。由于SET ROWCOUNT在执行查询的语句之外使用,因此无法在查询计划中考虑其值。
这意味着实际上可能存在性能差异。