14

NOCOUNT在 SQL Server 查询中关闭的优点和缺点是什么?

4

7 回答 7

18

从 SQL BOL:

SET NOCOUNT ON 防止为存储过程中的每个语句向客户端发送 DONE_IN_PROC 消息。对于包含多个不返回太多实际数据的语句的存储过程,将 SET NOCOUNT 设置为 ON 可以显着提高性能,因为大大减少了网络流量。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms189837.aspx 。
此外,SQLServerCentral 上的这篇文章在这个主题上也很棒:
NOCOUNT 的性能影响

于 2008-08-25T18:15:57.747 回答
8

减少的不仅仅是网络流量。SQL Server 内部有一个提升,因为可以通过减少额外查询来优化执行计划,以确定有多少行受到影响。

于 2008-08-25T18:18:00.097 回答
4

它只是停止显示影响发送/显示的行数的消息,这提供了性能优势,特别是如果您有许多将返回消息的语句。它提高了性能,因为通过网络(在 sql 服务器和前端之间)发送的数据更少。

BOL 的更多内容:设置编号

于 2008-08-25T18:18:05.447 回答
1

由于上述原因,我总是将其设置为 ON,但如果您的 proc 中有超过 1 个结果集,它可能会弄乱客户端代码

于 2008-08-25T18:19:09.050 回答
0

对于以手动方式运行并使用大量语句输出调试消息的查询,我个人喜欢打开NOCOUNT 。Print通过这种方式,您的输出看起来不像:

更新用户名
(更新了 287 行)

完毕
更新密码
(更新了 287 行)

完毕
做接下来的事
(更新了 1127 行)

完毕

更像

更新用户名
完毕

更新密码
完毕

做接下来的事
完毕

根据您更新内容的敏感性,有时包含计数会有所帮助;但是,对于具有大量输出的复杂脚本,我通常喜欢将它们排除在外。

于 2008-08-25T18:25:34.617 回答
0

SET NOCOUNT ON 是一个单行语句,Sql 服务器将消息发送回客户端。这是针对每个进程执行的(即 .. 选择、插入、更新、删除)。如果您避免此消息,我们可以提高数据库的整体性能,也减少网络流量

对于 EX:

声明@a table(id int)

设置不计数

插入 @a 选择 1 联合选择 2

取消计数

于 2012-10-27T13:52:40.587 回答
0

停止将指示受 Transact-SQL 语句影响的行数的消息作为结果的一部分返回。

于 2014-04-09T06:10:21.710 回答