2016-07-17 19 views
0

私はシステム/ソリューション全体を追跡するアクティビティテーブルを持っています。 アクティビティテーブルのトリガを作成しました。このトリガによって、私は他のシステムで使用されるシステムのすべてのイベントをキャプチャしています。さらに私はイベントとEVENTCOLVALテーブルに変更(I/U/D)を挿入しています。 EVENTCOLVALテーブルには、アクティビティテーブルのすべての列名と対応する値が含まれます。 テーブルの挿入、更新、削除イベントのキャプチャ別のテーブルへのトリガと挿入

は、だから私のトリガーは、次のようになります。

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; 

PS:私は、アクティビティテーブル内の30個の列を持っているので、それはパフォーマンスヒットになりますように私は、トリガーのテーブルEVENTCOLVALのために複数のインサートを使用する必要はありません31行を挿入するとパフォーマンス上の問題になります。また、アクティビティ・テーブルのメトリックは、1秒で少なくとも100個挿入されます。したがって、少なくとも3000行を1秒で挿入します。これは、トリビュートの同期性のために、アクチビティ画面の速度を遅くし、システム全体を遅くします。他にも可能な方法はありますか?

答えて

1

ネストしたコレクション+使用化合物トリガー(例:http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#CIHEFGFD)+すべての挿入を作成することができます。 擬似コード:

CREATE OR REPLACE TRIGGER compound_trigger ... 
........ 
l_nested t_nested := t_nested(); 
........ 
BEFORE EACH ROW IS 
    BEGIN 
    l_nested.extend(); 
    l_nested(l_nested.count) := ...//populate single row 
END BEFORE EACH ROW; 

AFTER STATEMENT IS 
BEGIN 
    FORALL i IN 1..l_nested.count 
    INSERT INTO EVENTCOLVAL(EventId, COLNAME, COLVALUE) VALUES (l_nested(i).eventId, l_nested(i).colName,l_nested(i).value); 
END AFTER STATEMENT; 
+0

私はlate.Iはあなたがコレクションを言っ理解コメントすることは本当に申し訳ありませんあなたは、挿入のためのFORALLの使用を言ったとき、私も理解していますが、使用の複合トリガーを言った理由を理解していませんでした。あなたの答えを受け入れるのを待っていると返信のために多くのおかげで多くの感謝:) –

+0

@AnkurBhutani行の前に化合物tiggers stmtあなたはコレクションにすべてのstmtを追加します。次に、stmtの後に、すべてのstmtを一度に挿入します。これを想像してみましょう。あなたは1つのstmtで3行を更新します。それから、ordinallyトリガーは3つの別個のインサートを作り、化合物はそれが1つのstmtであることを認識する。各行の3回前に起動し、データを収集し、stmtが3レコードを1つ挿入した後に発生させます。 –

+0

面白い音、私はそれを行って、感謝します。あなたの答えを受け入れる:) –

関連する問題