Pun*_*cky 2 triggers oracle11g
我的应用程序中有大约 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;
Run Code Online (Sandbox Code Playgroud)
谢谢!
对于任何一般性能问题,唯一现实的答案是在您的环境中进行尝试,并对您看到的实际性能影响进行基准测试。添加触发器会在某些环境中产生严重的性能问题,而不会对其他环境产生可测量的影响。我们无法确定您的系统将属于哪个类别(或者它是否会属于某个中间状态)。
添加触发器将强制为您更新的每一行执行两个 SQL 到 PL/SQL 上下文转换。对于您修改的行相对较少的普通 OLTP 系统,该开销可能相对较低。另一方面,对于一次更新数百万行的普通数据仓库系统,这种开销可能非常大。对于一般的 OLTP 系统,您不担心这里或那里的几毫秒,触发器可能不会很重要。另一方面,如果您非常关注横向扩展或者您有非常严格的服务级别协议,则添加触发器可能会产生问题。
从功能的角度来看,您还应该知道,如果您使用触发器UPDATE,修改多行的语句通常会得到不同的last_update值,而不是last_update如果您将last_update修改添加到UPDATE语句中,则会得到相同的值。这可能与您相关,也可能不相关,但这是需要注意的。
顺便提一下,似乎没有任何理由if (updating)在您的代码中添加语句。如果您正在编写before update触发器,那么您总是会进行更新,因此检查您是否正在进行更新实际上没有意义。