SET NOCOUNT ON 使用情况

2023-12-25

灵感来自这个问题 https://stackoverflow.com/questions/1483383/is-this-stored-procedure-thread-safe-or-whatever-the-equiv-is-on-sql-server对 SET NOCOUNT 有不同的看法...

我们应该对 SQL Server 使用 SET NOCOUNT ON 吗?如果没有,为什么不呢?

它能做什么编辑 6,2011 年 7 月 22 日

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

对于触发器等,客户端将收到多个“受影响的 xx 行”,这会导致某些 ORM、MS Access、JPA 等出现各种错误(请参阅下面的编辑)

背景:

一般接受的最佳实践(我认为直到这个问题)是使用SET NOCOUNT ONSQL Server 中的触发器和存储过程。我们在任何地方都使用它,快速谷歌一下就会发现很多 SQL Server MVP 也同意这一点。

MSDN 说这可能会破坏.net SQL数据适配器 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx.

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

  • IF EXISTS 以避免重复(没有行受影响的消息)注意:谨慎使用
  • WHERE NOT EXISTS(行数少于预期
  • 过滤掉琐碎的更新(例如没有数据实际改变)
  • 之前进行任何表访问(例如日志记录)
  • 隐藏复杂性或非规范化
  • etc

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

我可能遗漏了一些东西(请随意指出明显的地方),但是你们觉得呢?

注意:自从我看到这个错误以来已经很多年了,因为我现在不使用 SQLDataAdapter。

评论和问题后的编辑:

编辑:更多想法...

我们有多个客户端:一个可能使用 C# SQLDataAdaptor,另一个可能使用 Java 中的 nHibernate。这些可以通过不同的方式受到影响SET NOCOUNT ON.

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

编辑2:a触发破坏 nHibernate 问题 https://stackoverflow.com/questions/1354362, where SET NOCOUNT ON无法设置

(不,它不是重复的this https://stackoverflow.com/questions/995589/set-nocount-off-or-return-rowcount)

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

  • ,导致 SQL 2000 及更早版本上断开连接的问题
  • 性能增益演示 http://sqlmag.com/sql-server-2000/seeing-believing

编辑 4:2011 年 5 月 13 日

未指定时也会中断 Linq 2 SQL? https://stackoverflow.com/q/5880413/27535

编辑 5:2011 年 6 月 14 日

使用表变量破坏 JPA、存储过程:JPA 2.0 是否支持 SQL Server 表变量? https://stackoverflow.com/q/6344631/27535

编辑 6:2011 年 8 月 15 日

SSMS“编辑行”数据网格需要 SET NOCOUNT ON:使用 GROUP BY 更新触发器 https://stackoverflow.com/q/7067329/27535

编辑 7: 2013 年 3 月 7 日

来自 @RemusRusanu 的更多深入细节:
SET NOCOUNT ON 真的能带来那么大的性能差异吗 https://stackoverflow.com/questions/1915405/does-set-nocount-on-really-make-that-much-of-a-performance-difference/1918085#1918085


好吧,现在我已经完成了研究,这是交易:

在TDS协议中,SET NOCOUNT ON只保存每个查询 9 个字节 https://msdn.microsoft.com/en-us/library/dd340553.aspx而文本“SET NOCOUNT ON”本身就有 14 个字节。我曾经以为123 row(s) affected是从服务器在单独的网络数据包中以纯文本形式返回的,但事实并非如此。它实际上是一个名为的小结构DONE_IN_PROC嵌入到响应中。它不是一个单独的网络数据包,因此不会浪费任何往返。

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

这里有一个关于微不足道的非常详细的分析SET NOCOUNT环境:https://web.archive.org/web/20210128112523/http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/ https://web.archive.org/web/20210128112523/http://daleburnett.com/2014/01/everything-ever-wanted-know-set-nocount/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SET NOCOUNT ON 使用情况 的相关文章

  • 在旧版本的 MySQL (<5.5.0) 中模拟 TO_SECONDS()

    出于性能和简单性的原因 我想以秒的形式获取 MySQL 3 x 服务器中 DATETIME 列的内容 或者实际上任何数字类型 我只是想在使用 UNIX TIMESTAMP 时避免所有明显的时区问题 the我表中的日期确实来自不同的区域设置
  • DBCC命令是存储过程还是函数?

    应该是什么DBCC命令被调用 DBCC 过程还是 DBCC 函数 这很令人困惑 因为DBCC PAGE可以在不加前缀的情况下执行EXEC语句很像存储过程 但EXEC DBCC PAGE 1 1 1 3 抛出错误 语法错误 消息 156 关键
  • SQL 性能,使用 OPTION (FAST n)

    谁能告诉我在 SQL 查询中使用 OPTION FAST n 有什么缺点 比如我这么快就抓取了10万条记录 但这对SQL Server的其他进程有影响吗 我正在接近我的问题 我必须每周运行一次数据处理 因此 第一个结果会在 5 7 秒后出现
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 在 AppEngine 项目之外使用 Google AppEngine 数据存储区

    对于我的小框架Pyxer http code google com p pyxer 我希望能够在 AppEngine 项目之外使用 Google AppEngine 数据存储 因为我现在已经习惯了这种 ORM 模式 对于一些快速的黑客来说
  • 默认情况下 dbo 架构中的 EF 6 Code First __MigrationHistory

    我是代码优先实体框架的新手 第一次运行我的应用程序后登录数据库时 当我看到 MigrationHistory 表时 我有点困惑 我现在了解对此表的需求 但不喜欢它位于用户表内的标准 dbo 模式中 我认为它很唐突且有风险 我的第一个想法是将
  • 查找 SQL Server 中表的 B 树高度

    由于数据库数据以B Tree的形式组织在8k页中 对于PK信息也是如此 数据库中的每个表都应该可以计算B Tree的高度 从而揭示达到某些数据需要多少次跳跃 由于行大小和 PK 大小都非常重要 因此很难计算 因为例如varchar 250
  • 方法“Boolean Contains(System.String)”不支持对 SQL 的转换

    方法 Boolean Contains System String 不支持对 SQL 的转换 查询是 IsQueryable 但这停止工作 foreach string s in collection1 if s Length gt 0 q
  • Linq 选择与另一个表中的 ID 相等的项目

    我不确定这怎么可能 但我有两个表 我想通过表 1 的值从表 2 中获取值 表 1 有一个名为 rank 的外键 它是int 表 2 有一个名为 name 的值 它是string 现在表 1 的 排名 与表 2 的 ID 相关 所以当我说 v
  • 如何手动设置auto_increment的下一个值?

    我手动向表中添加了一些行 并且还手动设置了 ID 自动增量 现在 当我尝试通过我的应用程序将新行添加到数据库表中时 我收到错误 创建的 ID 值已存在 如何手动设置下一个ID值 例如 在表中我必须有ID 那么如何告诉PostgreSQL 下
  • 不同提供商的相同 EDMX 文件

    我正在开发一个项目 其中有一个本地数据库 SQL CE 在不存在与服务器的连接的情况下用作缓冲区 在服务器上我想使用相同的数据库布局 当然 我想使用服务器和客户端上可用的 Common dll 中的相同 EDMX 文件 在客户端中 我有一个
  • 对 SQL 时间序列进行采样

    我有一个日期时间的时间序列 存储在 mySQL 中的双列 并且希望每分钟对时间序列进行采样 即以一分钟的间隔提取最后一个值 有没有一种有效的方法可以在一个 select 语句中执行此操作 蛮力方法将涉及选择整个系列并在客户端进行采样或为每个
  • 如何使用外连接和分组依据在查询中包含 NULL 值

    我有两个表 其中包含以下示例数据 Table 1 item name item id item desc 1 apple 2 orange 3 banana 4 grape 5 mango Table 2 user items user i
  • 如何比较 Postgresql 中日期时间字段中的日期?

    在比较 postgresql Windows 中的版本 9 2 4 中的日期时 我遇到了一个奇怪的情况 我的表中有一列说update date与类型timestamp without timezone 客户可以仅使用日期搜索此字段 例如 2
  • 我想从 Crystal Report .rpt 文件中提取 SQL 查询,有办法做到这一点吗?

    我想从 Crystal Report rpt 文件中提取 SQL 查询 有办法做到这一点吗 我没有任何 Crystal Reports 产品 只有 rpt 文件 下面是一个 Net 代码示例 它从给定目录中的所有 Crystal Repor
  • SSIS Master 包执行来自另一个项目的包

    我有多个SSIS项目 但其中的一些包是相同的 我想创建一个包含所有内容的项目generic包并将其他项目与他们的特定包一起保存 所以我的问题是 是否有可能有一个主包可以执行并将父变量传递给另一个项目的包 我是 SSIS 新手 如果这是一个明
  • mysql 中 INSERT 语句的计算列

    假设我想要一个表来记录其他表中的日期和列数 或者任何类型的数学 字符串连接等 CREATE TABLE log id INTEGER NOT NULL AUTO INCREMENT date DATETIME NOT NULL count
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • JbdcTemplate - 带有动态 SQL 查询的PreparedStatements

    I know jdbcTemplate可以用来创建PreparedStatements如果你这样设置 i e private JdbcTemplate jdbcTemplate String sqlQuery Select from tab
  • 为什么 SSRS 报表从 SQL Server Reporting Services 运行时生成的数据与使用“预览”选项卡运行时生成的数据不同?

    我有一个运行我想要的数据的报表 从 预览 选项卡 即 或者在 VS 2010 中使用 F5 运行时 但是当我将报表 rdl 文件 上传到 SQL Server Reporting Services 并运行更新后的报表时从那里报告 它仍然显示

随机推荐