【发布时间】:2016-07-17 07:46:18
【问题描述】:
我有一个跟踪整个系统/解决方案的活动表。 我在上面的 Activity 表上创建了一个触发器。通过这个触发器,我正在捕获系统的每个事件,这些事件将被其他系统使用。此外,我将更改(I/U/D)插入到 Event 和 EVENTCOLVAL 表中。 EVENTCOLVAL 表包含 Activity 表的所有列名和对应值。
所以我的触发器看起来像这样:
CREATE OR REPLACE TRIGGER TRIG_Actv
AFTER INSERT or UPDATE
ON Activity
FOR EACH ROW
DECLARE
lvEventId number;
BEGIN
lvEventId := EventUniqId.NEXTVAL;
INSERT ALL
INTO Event (EventId,DateLastMaint)
VALUES (lvEventId, SYSTIMESTAMP)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol1', :new.ActivityCol1)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol2', :new.ActivityCol2)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol3', :new.ActivityCol3)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol4', :new.ActivityCol4)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol5', :new.ActivityCol5)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol6', :new.ActivityCol6)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol7', :new.ActivityCol7)
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol8', :new.ActivityCol8)
---
---
---
---
---
INTO EVENTCOLVAL (EventId, COLNAME, COLVALUE)
VALUES (lvEventId, 'ActivityCol30', :new.ActivityCol30)
SELECT * FROM dual;
EXCEPTION
WHEN OTHERS THEN
-------
END TRIG_Actv;
P.S:我不想在触发器中对表 EVENTCOLVAL 使用多次插入,因为这会影响性能,因为我在 Activity 表中有 30 列,插入 31 行将是性能问题。此外,活动表的指标是 1 秒内至少 100 次插入。因此,每秒插入至少 3000 行。由于触发器的同步特性,这将使活动屏幕变慢,实际上整个系统也变慢。有没有其他方法可以
【问题讨论】:
标签: sql oracle performance plsql triggers