gpt4 book ai didi

performance - 合并多个 Oracle 触发器。任何性能影响?

转载 作者:行者123 更新时间:2023-12-04 14:49:47 34 4
gpt4 key购买 nike

我们的大多数 table 都有一个 BEFORE INSERT OR UPDATE触发器,以设置ID的BEFORE INSERT并设置创建/修改用户/日期BEFORE INSERT OR UPDATE .

有几个带有附加触发器的表,它们与前一个表分开,以使其意图更加明确。此外,这些额外的触发器可以独立于前一个触发器而被禁用,而前一个触发器不应被禁用。

在大多数情况下,额外的触发器也会触发 BEFORE INSERT OR UPDATE并且顺序并不重要,因为它们涵盖了不同的列/用例。所以一般来说,它们可以组合成单个触发器。

有没有关于通话速度的研究1n表上的触发器?或者这与单行插入/更新几乎无关?换句话说,是否只有 1 个全局 SQL -> PL/SQL上下文切换,或者每个触发器会有 1 个上下文切换。

最佳答案

我现在已经对这种情况进行了基准测试,我得出的结论是,当添加 1 个触发器时,很可能由于 PL/SQL 上下文切换而导致显着的性能损失。在我的基准测试中,损失是 8 倍。然而,添加第二个“兼容”触发器不再有任何重大影响。通过“兼容”,我的意思是两个触发器总是以任何顺序在同一事件中触发。

所以我的结论是很可能只有 1 SQL -> PL/SQL所有触发器的上下文切换

这是基准:

创建一个表

-- A typical table with primary key, creation/modification user/date, and 
-- other data columns
CREATE TABLE test(
id number(38) not null, -- pk
uc varchar2(400) not null, -- creation user
dc date not null, -- creation date
um varchar2(400), -- modification user
dm date, -- modification date
data number(38)
);

...和一个序列
CREATE SEQUENCE s_test;

典型的触发器设置 ID、创建/修改用户/日期
CREATE OR REPLACE TRIGGER t_test BEFORE INSERT OR UPDATE
ON test
FOR EACH ROW
BEGIN
IF inserting THEN
SELECT s_test.nextval INTO :new.id FROM dual;

:new.uc := USER;
:new.dc := SYSDATE;
:new.um := NULL;
:new.dm := NULL;
END IF;
IF updating THEN
:new.um := USER;
:new.dm := SYSDATE;
:new.uc := :old.uc;
:new.dc := :old.dc;
END IF;
END t_test;

插入 1000、10000、100000 条记录
declare
procedure run (limit number) is
t timestamp;
begin
t := systimestamp;

insert into test (data)
select level from dual connect by level < limit;

dbms_output.put_line(to_char(systimestamp - t));

rollback;
end;
begin
run(1000);
run(10000);
run(100000);
end;

结果
-- ------------------------------------
-- +000000000 00:00:00.086603000
-- +000000000 00:00:00.844333000
-- +000000000 00:00:08.429186000
-- ------------------------------------

另一个“兼容”触发器(与执行顺序无关)
CREATE OR REPLACE TRIGGER t_test_other BEFORE INSERT OR UPDATE
ON test
FOR EACH ROW
BEGIN
:new.data := 42;
END t_test_other;

再次运行测试脚本的结果
-- ------------------------------------
-- +000000000 00:00:00.088551000
-- +000000000 00:00:00.876028000
-- +000000000 00:00:08.731345000
-- ------------------------------------

停用触发器
alter trigger t_test disable;
alter trigger t_test_other disable;

运行稍微不同的测试脚本
declare
procedure run (limit number) is
t timestamp;
begin
t := systimestamp;

insert into test (id, uc, dc, data)
select s_test.nextval, user, sysdate, level from dual
connect by level < limit;

dbms_output.put_line(to_char(systimestamp - t));

rollback;
end;
begin
run(1000);
run(10000);
run(100000);
end;

结果
-- ------------------------------------
-- +000000000 00:00:00.012712000
-- +000000000 00:00:00.104903000
-- +000000000 00:00:01.043984000
-- ------------------------------------

关于performance - 合并多个 Oracle 触发器。任何性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579240/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com