【问题标题】:Is there a performance penalty for a trigger with no code?没有代码的触发器是否会降低性能?
【发布时间】:2017-03-03 17:45:41
【问题描述】:

表上有一个用于更新、插入和删除的触发器,但该触发器的 T-SQL 创建脚本只包含以下语句:

SET NOCOUNT ON

与没有触发器相比,此触发器是否存在(显着)性能损失?与完全没有触发器相比,没有语句(代码)的触发器是否会有任何(显着)性能损失?

【问题讨论】:

  • 为什么要保留一个什么都不做的触发器?
  • @HLGEM - 我不会。当我发现它“什么都不做”时,我立即删除了引发这个问题的触发器。我问这个问题是因为我很好奇触发器可能产生的影响。

标签: sql sql-server performance triggers


【解决方案1】:

如果不深入了解优化器在做什么,或者运行一堆测试来检查,这很难说。但是也很难说你对重要的想法有多重要。

因此,如果您每秒钟执行数千次更新,那么触发器可能会导致性能显着下降...另一方面,每分钟运行几次更新您可能根本不会注意到。在任何一种情况下,触发器都会被编译,并且可能会被优化而不再存在。

除非性能困扰我,否则我不会为性能而烦恼。如果您认为它引起了您的问题,请测量它,将其移除并重新测量。

同样,我有一个 DBA 建议我应该用 Isnull(xyz, 0) 替换 Coalesce(xyz, 0)。查询并没有困扰我,但建议确实如此,所以我做了一些测量,发现它确实快了 30%。但是在我的查询中的两个合并调用中的每一个都为 0.00000031 时,我没有改变我的查询;-

【讨论】:

    【解决方案2】:

    此语句可防止将额外消息传递回调用方。

    假设您的触发器中有 5 个更新语句。如果您没有 NOCOUNT 行,调用者将收到来自所有 5 个语句的消息。像这样的东西: (1 行受影响) (1 行受影响) (1 行受影响) (1 行受影响) (1 行受影响)

    如果您设置了 NOCOUNT 语句,那么他们只会收到最终结果消息: (1 行受影响)

    这未必是件坏事——有些系统并不关心额外的消息,而且您的数据库可能没有那么大,以至于您不会关心任何性能损失。尽管其他一些系统确实关心 - 我知道我必须记住在从 Reporting Services (SSRS) 调用的存储过程中使用 NOCOUNT。

    【讨论】:

    • 我问的是触发代码的性能损失,而不是SET NOCOUNT ON 语句的功能。
    • 当你说“如果你设置了 NOCOUNT 语句,那么他们只会收到最终结果消息:(1 行受影响)”,我认为你也是不正确的——他们不会甚至不会收到“最终结果消息”。
    • 我觉得答案不值得-1,但这是你的问题。我觉得你的问题是关于陈述本身的一个更一般的问题。顺便说一句,您将在 NOCOUNT 语句中收到“(1 行受影响)”消息。运行测试并亲自查看。
    猜你喜欢
    • 2011-12-25
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多