代码之家  ›  专栏  ›  技术社区  ›  Ralph Shillington

设置nocount真的会让性能有很大的不同吗

  •  12
  • Ralph Shillington  · 技术社区  · 15 年前

    在这 article 作者认为,存在与 SET NOCOUNT ON 而且“通过从网络中消除额外的开销,它可以大大提高数据库和应用程序的总体性能”

    作者引用了从2000年到2005年默认存储过程模板中的一个更改,并建议“微软甚至意识到了这个问题”,这促使了该模板中的更改。

    是否有人有确凿的证据支持或反驳通过设置nocount获得的所声称的绩效收益?

    3 回复  |  直到 9 年前
        1
  •  8
  •   Community    7 年前

    这里是我问题的最后一个链接:“ SET NOCOUNT ON usage “指的是 article on it .

    考虑到它是多么的琐碎,为什么不把它放进去,停止客户端处理另一个结果集呢?

    而没有 SET NOCOUNT ON ,NHiberinate也可能断裂(在问题中提到)

        2
  •  11
  •   Remus Rusanu    15 年前

    在某些情况下,必须设置nocount。在通过sqlclient的beginExecutexx方法利用线程池设计基于异步处理的高性能中间层时,行计数存在非常严重的问题。一旦 第一 响应数据包由服务器返回。但是,当调用EndExecutexx时,调用完成后,非查询请求就完成了。每个行数响应都是一个响应。当执行甚至是中等复杂的过程时,第一行计数可能在5-10毫秒内返回,而调用在300-500毫秒内完成。它没有在500毫秒后返回提交的异步请求,而是在5毫秒后回调,然后在endexecutexxx中回调495毫秒。结果是异步调用过早完成。并在EndExecuteNoQuery调用中阻止线程池中的线程。这会导致螺纹刀具饥饿。我已经看到高性能系统通过在特定场景中添加set nocount,将吞吐量从每秒数百个调用提高到每秒数千个调用。

    考虑到对于大规模/高吞吐量的中间层处理,异步调用是唯一的方法,因此nocount几乎是一个强制性要求。

        3
  •  1
  •   Phy Data DBA    9 年前

    我同意使用nocount是个好主意。 把它添加到每个存储过程或动态SQL语句中执行的所有代码中是一个糟糕的主意。

    尤其是当你谈论高性能的时候。TSQL NOCOUNT应该根据数据访问层中的代码的需要进行设置。就像事务和锁定级别一样。

    在每次执行的SQL中设置这些内容并不能通过在连接应用程序的代码中设置它们来提高性能。

    通过编写更好的代码,而不是向所有SQL添加set nocount语句,可以获得更好的性能。