首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据使用情况设置NOCOUNT

根据使用情况设置NOCOUNT
EN

Stack Overflow用户
提问于 2009-09-27 14:52:29
回答 16查看 308.2K关注 0票数 356

这个问题的启发,在SET上有不同的观点。

我们是否应该将SET NOCOUNT用于Server?若否,原因为何?

编辑6,2011年7月22日

它会在任何DML之后取消"xx行受影响“消息。这是一个结果集,当发送时,客户端必须处理它。它很小,但是可以测量(见下面的答案)

对于触发器等,客户端将接收多个受影响的"xx行“,这会导致一些ORM、MS Access、JPA等方面的各种错误(参见下面的编辑)。

背景:

一般公认的最佳实践(直到这个问题之前)是在Server中的触发器和存储过程中使用SET NOCOUNT ON。我们在任何地方都使用它,一个快速的google显示了大量的Server也表示同意。

MSDN说,这会破坏.net SQLDataAdapter

现在,对我来说,这意味着SQLDataAdapter被限制在完全简单的CRUD处理上,因为它期望"n行受影响“消息匹配。所以,我不能用:

  • 如果存在以避免重复(没有行受影响的消息)-注:谨慎使用
  • 不存在的地方(比预期的行少)
  • 过滤掉琐碎的更新(如没有数据实际更改)
  • 之前是否进行任何表访问(例如日志记录)
  • 隐藏复杂性或去休眠

在问题中,marc_s (谁知道他的SQL内容)说不要使用它。这与我所认为的不同(我也认为自己在SQL方面有一定的能力)。

也许我遗漏了一些东西(随便指出一些显而易见的事情),但是你们认为呢?

注意:我已经多年没有看到这个错误了,因为我现在不使用SQLDataAdapter了。

在评论和问题之后编辑:

编辑:更多想法..。

我们有多个客户端:一个可以使用C# SQLDataAdaptor,另一个可以使用来自Java的nHibernate。使用SET NOCOUNT ON可以以不同的方式影响这些因素。

如果您将存储过程视为方法,那么假设某些内部处理为您自己的目的以某种方式工作是不好的形式(反模式)。

编辑2:触发中断nHibernate问题,其中无法设置SET NOCOUNT ON

(不,这不是的复制品)

编辑3:还有更多的信息,感谢我的MVP同事

  • KB 240882,引发SQL 2000及更早版本上的断开连接的问题。
  • 性能增益演示

编辑4: 2011年5月13日

未指定时也会中断Linq 2 SQL?

编辑5: 14 2011年6月14日

破坏JPA,用表变量存储proc:JPA2.0支持Server表变量吗?

编辑6: 15 2011年8月15日

SSMS“编辑行”数据网格要求将NOCOUNT设置为:使用组更新触发器

编辑7: 07 2013年3月

详情见@RemusRusanu:

设置NOCOUNT真的能使性能有很大的不同吗?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-10-10 10:00:39

好吧,现在我做了我的研究,下面是交易:

在TDS协议中,SET NOCOUNT ON只保存9-每个查询的字节,而文本"SET NOCOUNT ON“本身却高达14字节。我以前认为123 row(s) affected是在一个单独的网络包中以纯文本形式从服务器返回的,但事实并非如此。实际上,它是嵌入在响应中的一个名为DONE_IN_PROC的小结构。这不是一个单独的网络包,所以不会浪费往返时间。

我认为你可以坚持默认计数的行为,几乎总是不用担心表现。但是,在某些情况下,预先计算行数会影响性能,例如只向前游标。在这种情况下,NOCOUNT可能是必要的。除此之外,绝对没有必要遵循“尽可能使用NOCOUNT”的座右铭。

下面是关于SET NOCOUNT设置不重要的详细分析:http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/

票数 265
EN

Stack Overflow用户

发布于 2012-10-14 16:20:26

  • 当设置为NOCOUNT时,计数(指示受Transact-SQL语句影响的行数)不返回。当SET NOCOUNT为OFF时,将返回计数。它与任何SELECT、INSERT、UPDATE、DELETE语句一起使用。
  • SET NOCOUNT的设置在执行或运行时设置,而不是在解析时设置。
  • 在改进存储过程(SP)性能上设置NOCOUNT。
  • 语法:设置NOCOUNT { ON \ OFF }

设置NOCOUNT的示例:

设置NOCOUNT OFF的示例:

票数 89
EN

Stack Overflow用户

发布于 2009-09-27 14:56:24

我想在某种程度上这是DBA和开发人员之间的问题。

作为一个开发人员,我想说的是,除非绝对必须使用它,否则不要使用它--因为使用它会破坏您的ADO.NET代码(正如微软所记录的)。

我想作为一个DBA,你会更多地站在另一边--尽可能地使用它,除非你真的必须阻止它的使用。

另外,如果您的开发人员使用ADO.NET的ExecuteNonQuery方法调用返回的“ExecuteNonQuery”,那么如果每个人都使用SET NOCOUNT ON,那么就会遇到麻烦,因为在这种情况下,ExecuteNonQuery总是返回0。

也可以看一下彼得·布罗姆伯格的博客帖子,看看他的位置。

因此,这实际上取决于由谁来制定标准:-)

Marc

票数 39
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1483732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档