【问题标题】:TOP versus SET ROWCOUNTTOP 与 SET ROWCOUNT
【发布时间】:2009-01-22 11:32:26
【问题描述】:

TOPSET ROWCOUNT 之间的性能是否存在差异,或者它们只是以相同的方式执行?

【问题讨论】:

    标签: sql performance


    【解决方案1】:

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

    需要注意的一件事是,一旦您拥有 set rowcount,这将在连接的整个生命周期内持续存在,因此请确保在完成后将其重置为 0


    编辑(发表马丁的评论)

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

    请注意,SET ROWCOUNTBEGIN/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 行

    【讨论】:

    • stackoverflow.com/questions/863714/sql-rowcount-vs-top - 这两者之间几乎没有列出其他区别,以防有人感兴趣。
    • 我不认为最后一行是正确的。在这里查看我的答案stackoverflow.com/questions/5383761/…
    • @Richard:我一直认为BEGIN...END 只是一个复合语句。从来没有认为它也定义了一个范围。也许“全局”BEGIN...END 是一种特殊情况,它用于明确指定编程对象主体的开始和结束。但即便如此,我会说,它只是将编程对象的范围可视化,而不是定义自己的范围。
    • 每当您执行动态 SQL 时,您都会创建一个在其自己的连接上运行的新批处理。这不是一个很好的例子,即使包含在 Begin 和 End 中,Set RowCount 也可以工作。
    【解决方案2】:

    根据 BOL,关于性能的更多说明:

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

    Article on BOL

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

    【讨论】:

      猜你喜欢
      • 2018-02-24
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 2010-09-26
      相关资源
      最近更新 更多