Triggers Oracle触发器是否会导致性能问题

Triggers Oracle触发器是否会导致性能问题,triggers,oracle11g,Triggers,Oracle11g,我的应用程序中有大约100多个表。大多数更新查询不会更新上次更新的时间列。有100个查询,所以我对修改所有查询以包含上次更新的时间有点怀疑。我看到的另一个选项是为所有表创建一个oracle触发器,并在相关行更新时使用触发器更新LastUpdateTime字段 我的大多数表都有超过一百万行。Oracle触发器是否会导致任何性能问题?下面是我想到的高级语法: create OR REPLACE trigger TRIG_UPDATE before update on TESTSA

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

我的大多数表都有超过一百万行。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;

谢谢

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

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

从功能的角度来看,您还应该注意,如果在
UPDATE
语句中添加
last\u UPDATE
修改,则使用触发器而不是相同的
last\u UPDATE
值,则修改多行的
UPDATE
语句通常会得到不同的
last\u UPDATE
值。这可能与你有关,也可能与你无关,但这是需要注意的


作为旁注,似乎没有任何理由在代码中使用
if(更新)
语句。如果您在更新前编写了一个
触发器,那么您总是要进行更新,因此检查您是否正在进行更新是没有意义的。

非常感谢,这非常有帮助。对不起,我还有一个问题。触发器会锁定表并导致任何附加插入或更新等待吗?@PunterVicky-这完全取决于您的要求。触发器的存在与否不会改变锁的取出方式。它可能会导致
UPDATE
语句(在表和各行上)取出的锁被保留更长时间(不过,多长时间是一个悬而未决的问题)。这可能会导致其他会话等待更多的时间,但是对于普通的OLTP应用程序,您实际上只关心行级锁,而不是表锁,表锁只做保护表不受DDL影响的事情。