Oracle Kernel Level的触发器效率很高吗?

    下面的测试是基于Kernel Internal Trigger的实体化视图日志(Primary Key+Sequence):

SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 10001;

9424 rows created.

Elapsed: 00:00:01.38

Statistics
----------------------------------------------------------
      11249  recursive calls
      41052  db block gets
      16575  consistent gets
         15  physical reads
    8266284  redo size
        674  bytes sent via SQL*Net to client
        606  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          9  sorts (memory)
          0  sorts (disk)
       9424  rows processed

    下面的测试是基于Kernel Internal Trigger的实体化视图日志(Primary Key):

SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 10001;

9425 rows created.

Elapsed: 00:00:00.86

Statistics
----------------------------------------------------------
      10855  recursive calls
      40835  db block gets
      16383  consistent gets
          9  physical reads
    8181892  redo size
        679  bytes sent via SQL*Net to client
        606  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          9  sorts (memory)
          0  sorts (disk)
       9425  rows processed

    下面的测试是基于自定义Trigger的实体化视图日志(Primary Key):

SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM < 10001;

9424 rows created.

Elapsed: 00:00:00.90

Statistics
----------------------------------------------------------
      10372  recursive calls
      40274  db block gets
      16144  consistent gets
          5  physical reads
    7997420  redo size
        678  bytes sent via SQL*Net to client
        606  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          3  sorts (memory)
          0  sorts (disk)
       9424  rows processed

    下面这一段是用于生成实体第视图日志的自定义Trigger:

CREATE OR REPLACE TRIGGER TLOG$_T_OBJECTS
BEFORE INSERT OR UPDATE OR DELETE ON T_OBJECTS
FOR EACH ROW
BEGIN
  IF INSERTING THEN
     INSERT INTO MLOG_T_OBJECTS (OBJECT_ID, DMLTYPE$$) VALUES (:NEW.OBJECT_ID,'I');
  ELSIF UPDATING THEN
     IF (:OLD.OBJECT_ID = :NEW.OBJECT_ID) THEN
       INSERT INTO MLOG_T_OBJECTS (OBJECT_ID, DMLTYPE$$) VALUES (:NEW.OBJECT_ID,'U');
     ELSE
       INSERT INTO MLOG_T_OBJECTS (OBJECT_ID, DMLTYPE$$) VALUES (:NEW.OBJECT_ID,'D');
       INSERT INTO MLOG_T_OBJECTS (OBJECT_ID, DMLTYPE$$) VALUES (:NEW.OBJECT_ID,'I');
     END IF;
  ELSE
     INSERT INTO MLOG_T_OBJECTS (OBJECT_ID, DMLTYPE$$) VALUES (:NEW.OBJECT_ID,'D');
  END IF;
END;
/

    在10g的版本下, 居然看不出什么差别, 看来PL/SQL的执行效率的确是很高了.

留言 (2)

在8i上测试:

-- With mview log
SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM 8343 rows created.
Elapsed: 00:00:07.54

Statistics
----------------------------------------------------------
10418 recursive calls
35379 db block gets
48179 consistent gets
1 physical reads
7548200 redo size

-- With triggers
SQL> INSERT INTO T_OBJECTS SELECT * FROM ALL_OBJECTS WHERE ROWNUM 8343 rows created.
Elapsed: 00:00:09.72

Statistics
----------------------------------------------------------
9620 recursive calls
35064 db block gets
47884 consistent gets
1 physical reads
7351144 redo size

触发器的效率不知道会有多大的影响。
在这里我发了相关的帖子,请高手门看看。

http://www.oracle.com.cn/viewthread.php?tid=114932&extra=page%3D2

发表留言:

« Previous | Main | Next »

英语900句 | English 900

  • I had my breakfast on the way.
  • 我在路上吃的早饭.
  • I was just on time.
  • 我刚好赶上.
  • I was 10 minutes late.
  • 我迟到了五分钟.
  • I had lunch with a friend of mine.
  • 我和我的一个朋友一块吃了午饭.
  • I finished my work at 6 p.m.
  • 下午6点我下班了.