【发布时间】:2016-08-20 08:43:19
【问题描述】:
我想问一下复合触发器的性能问题,我最近实际实现了它,并且观察到了很大的性能改进。但是有一点我想讨论一下。
对于我的问题,请考虑以下场景:
假设创建了两个表,如下所示:
~ 创建了两个表:
:CREATE TABLE ORDERS (ORD_ID NUMBER, ITEM_CODE VARCHAR2(100), ORD_QTY NUMBER,ORD_DATE DATE);
:CREATE TABLE ORDER_ARCHIVE(ORD_ID NUMBER, ORD_CODE VARCHAR2(100));
~ 现在我创建了复合触发器,如下所示:
create or replace trigger TRG_COMP_SAL
for update or insert on ORDERS
compound trigger --Trigger Type is Compound here
type t_tbl_typ is table of ORDER_ARCHIVE%rowtype index by pls_integer;
v_tbl_events t_tbl_typ;
idx pls_integer := 0;
--After Each row statement
after each row is
begin
IF INSERTING THEN
idx := idx + 1;
v_tbl_events(idx).ORD_ID := :new.ORD_ID;
v_tbl_events(idx).ORD_CODE := :NEW.ITEM_CODE;
END IF;
-- Checking threshold limit for indx which will be used for bulk insert
if idx >= 100 then
forall cnt in 1 .. v_tbl_events.count()
insert into ORDER_ARCHIVE values v_tbl_events (cnt);
v_tbl_events.delete;
idx := 0;-- resetting threshold limit for indx which will be used for bulk insert
end if;
end after each row;
--After statement
after statement is
begin
IF INSERTING THEN
--Using forall to bulk insert data
forall cnt in 1 .. v_tbl_events.count()
insert into ORDER_ARCHIVE values v_tbl_events (cnt);
END IF;
end after statement;
end TRG_COMP_SAL;
与普通触发器相比,这肯定会更快执行。 但是,我有点困惑:
在批量插入的情况下,AFTER STATEMENT 和 BEFORE STATEMENT 将只执行一次,但每次插入 检查复合触发器中是否存在 BEFORE EACH ROW 和 AFTER EACH ROW 块,将调用复合触发器。
它不会影响性能吗?
请帮忙..
提前谢谢....
【问题讨论】:
-
等待帮助...
标签: oracle plsql oracle11g triggers