代码之家  ›  专栏  ›  技术社区  ›  Kenny Evitt

对于没有代码的触发器有性能惩罚吗?

  •  1
  • Kenny Evitt  · 技术社区  · 15 年前

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

    SET NOCOUNT ON
    

    与没有触发器相比,这个触发器有(显著的)性能惩罚吗?与完全没有触发器相比,没有语句(代码)的触发器是否会有任何(重大)性能损失?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Stephen Turner    15 年前

    如果不深入了解乐观者在做什么,或者运行一系列测试来检查,这很难说。但很难说你的“重要”概念有多重要。

    所以,从每一个极端来看,如果你每秒进行数千次更新,那么触发器可能会导致性能显著下降。。。另一方面,一分钟运行一些更新,你可能根本不会注意到。在这两种情况下,触发器将被编译,并且可能被优化而不存在。

    我自己,除非表演让我烦恼,否则我不会为表演而烦恼。如果你认为这是你的问题,测量它,删除它并重新测量。

    类似地,我有一个DBA建议我应该用Isnull(xyz,0)替换Coalesce(xyz,0)。这个问题并不困扰我,但是这个建议确实困扰了我,所以我做了一些测量,发现它确实快了30%。但是在我的查询中,对于两个联合callin中的每一个0.00000031,我没有修改我的查询-

        2
  •  -1
  •   jj.    15 年前

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

    假设触发器中有5个update语句。如果没有NOCOUNT行,调用者将从所有5条语句接收消息。像这样的: (1行受影响) (1行受影响) (1行受影响) (1行受影响) (1行受影响)

    如果设置了NOCOUNT语句,则它们将只接收最终结果消息: (1行受影响)

    这不一定是件坏事——有些系统不关心额外的消息,而且可能您的数据库没有您所关心的任何性能影响那么大。尽管其他一些系统确实关心这个问题——我知道我必须记住在从ReportingServices(SSRS)调用的存储过程中使用NOCOUNT。