【问题标题】:Will Oracle Trigger cause performance issuesOracle Trigger 会导致性能问题吗
【发布时间】:2015-02-16 13:10:55
【问题描述】:

我的应用程序中有大约 100 多个表。大多数更新查询不会更新最后更新的时间列。有 100 个查询,所以我有点怀疑修改所有查询以包含上次更新时间。我正在查看的替代选项是为所有表创建一个 oracle 触发器,并在相关行更新时使用触发器更新 lastupdatedtime 字段。

我的大多数表都有超过一百万行。 Oracle 触发器会导致任何性能问题吗?以下是我正在考虑的高级语法:

  create  OR REPLACE  trigger  TRIG_UPDATE
    before update  on TESTSAMPLE
    for each row
    declare
    begin

      if (updating) then
        :new.last_update :=CURRENT_TIMESTAMP;
     end if;
  end;

谢谢!

【问题讨论】:

    标签: triggers oracle11g


    【解决方案1】:

    对于任何一般性能问题,唯一现实的答案是在您的环境中进行尝试,并对您看到的实际性能影响进行基准测试。添加触发器会在某些环境中产生重大的性能问题,并且对其他环境没有可衡量的影响。我们无法确定您的系统将属于哪个类别(或者它是否会属于某个中间状态)。

    添加触发器将强制您更新的每一行将两个 SQL 转换为 PL/SQL 上下文。对于修改相对较少行的普通 OLTP 系统,该开销可能相对较低。另一方面,对于您一次更新数百万行的普通数据仓库系统,这种开销可能相当大。对于您不必担心这里或那里几毫秒的普通 OLTP 系统,触发器可能不会很重要。另一方面,如果您非常关注向外扩展,或者您的服务水平协议非常严格,那么添加触发器可能会产生问题。

    从功能的角度来看,您还应该知道,如果您使用触发器,修改多行的UPDATE 语句通常会以不同的last_update 值结束,而不是如果添加相同的last_updatelast_updateUPDATE 语句的修改。这可能与您相关,也可能不相关,但需要注意。

    顺便说一句,似乎没有任何理由在您的代码中包含 if (updating) 语句。如果您正在编写 before update 触发器,那么您将始终进行更新,因此检查您是否正在执行更新实际上没有任何意义。

    【讨论】:

    • 非常感谢,这很有帮助。
    • 抱歉,还有一个问题。触发器会锁定表并导致任何其他插入或更新等待吗?
    • @PunterVicky - 这完全取决于您的要求。触发器的存在与否不会改变取出的锁。它可能会导致UPDATE 语句取出的锁(在表和各个行上)被持有更长的时间(但是,多长时间是一个悬而未决的问题)。这可能会导致其他会话等待更多时间,但对于普通的 OLTP 应用程序,您实际上只关心在这种情况下的行级锁,而不是表锁,它们只做诸如保护表免受 DDL 之类的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2017-04-02
    • 1970-01-01
    • 2019-06-17
    相关资源
    最近更新 更多