【问题标题】:Do triggers decreases the performance? Inserted and deleted tables?触发器会降低性能吗?插入和删除表?
【发布时间】:2010-11-29 18:21:19
【问题描述】:

假设我有对表执行插入/更新/删除操作的存储过程。

根据一些标准,我想执行一些操作。

我应该创建触发器还是在存储过程本身中执行操作。

使用触发器会降低性能吗?

Inserteddeleted 这两个表是存在(持久)还是动态创建的?

如果它们是动态创建的,是否存在性能问题。

如果它们是持久表,那么它们在哪里?

此外,如果它们退出,那么我可以访问存储过程中的 InsertedDeleted 表吗?

【问题讨论】:

  • 不会降低性能,因为插入和删除的表是动态创建的,并且记录是在触发器中插入到这些表中的。如果我们在存储过程中做同样的事情,这些表就不会出现,从而提高性能。

标签: sql-server stored-procedures triggers


【解决方案1】:

它会比在存储过程中做同样的事情性能低吗?可能不是,但对于所有性能问题,真正了解的唯一方法是使用真实数据集测试这两种方法(如果您有一个 2,000,000 条记录的表,请不要使用具有 100 条记录的表进行测试!)

也就是说,触发器和其他方法之间的选择完全取决于相关操作是否需要发生,无论数据如何更新、删除或插入。如果这是一个无论如何都必须始终发生的业务规则,那么触发器是它的最佳位置,否则您最终将遇到数据完整性问题。数据库中的数据经常从 GUI 以外的来源更改。

在编写触发器时,您应该注意几件事。首先,触发器为每个批次触发一次,因此无论您插入一条记录还是 100,000 条记录,触发器都只会触发一次。您永远不能假设只有一条记录会受到影响。你也不能假设它永远只是一个很小的记录集。这就是为什么编写所有触发器就像要插入、更新或删除一百万行一样至关重要的原因。这意味着基于集合的逻辑,如果可能的话,没有游标或 while 循环。不要使用为处理一条记录而编写的存储过程并在触发器的游标中调用它。

同样不要从光标发送电子邮件,如果电子邮件服务器关闭,您不希望停止所有插入、更新或删除。

【讨论】:

    【解决方案2】:

    根据定义,它会降低查询的性能:查询会做一些原本不会做的事情。

    另一种看待它的方式是:如果您要手动执行触发器正在执行的任何操作,那么它们会通过节省往返行程来提高性能。

    更进一步:如果您使用存储过程并且无论如何都在一个服务器往返中运行,那么这种优势就会消失。

    所以这取决于你如何看待它。

    【讨论】:

      【解决方案3】:

      是的,带有触发器的表的性能不如没有它的表。逻辑表明,做某事比什么都不做更昂贵。

      如果您询问它是否比您未指定的其他方法更有效,我认为您的问题会更有意义。

      最终,我会选择最适合这项工作的工具,并且只在出现问题时才担心性能,而不是在您实施解决方案之前。

      插入和删除的表在触发器中可用,因此从存储过程中调用它们是不行的。

      【讨论】:

      • 你说得对我想知道“它是否比任何其他方法都更高效”我想知道如果插入和删除的表只能在触发器中访问,那么它们是在触发器时创建的被解雇还是永久桌子?如果它们是永久表,那么为什么我们不能在存储过程中访问它们
      • INSERTED 和 DELETED 是在触发器执行期间驻留在内存中的临时表。一旦你的触发器完成执行,它们就会消失,直到有其他东西导致触发器触发
      • 有时在进入解决方案之前考虑性能是一件好事,没有什么比进入一个项目却发现你必须重新开始更糟糕的了 - 性能是选择解决方案时要考虑的事情正确的解决方案之前您实施了错误的解决方案
      【解决方案4】:

      表现在什么方面?触发器将在事件发生后对数据库执行更新,因此您系统的用户甚至不会知道它正在发生。它发生在后台。

      您的问题措辞非常难以理解。

      【讨论】:

      • 我认为问题是指插入和删除表的存在。提供这些结构是否会影响性能。我的直觉说不,但我不确定。
      猜你喜欢
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2011-02-06
      • 2010-12-02
      相关资源
      最近更新 更多