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