Yeah…try saying that blog post title 10 times in a row as fast as you can
But since we’re talking about doing things fast, this is just a quick post about a conversation I had a twitter yesterday about the WHEN clause in a trigger.
That is an easy benchmark to whip up – I just need a couple of tables, each with a simple a trigger differing only by their usage of the WHEN clause. Here is my setup:
SQL> create table t1 ( x int );
Table created.
SQL> create table t2 ( x int );
Table created.
SQL> create or replace
2 trigger TRG1
3 before insert on t1
4 for each row
5 begin
6 if sys_context('USERENV','SID') = 0 then
7 :new.x := 0;
8 end if;
9 end;
10 /
Trigger created.
SQL> create or replace
2 trigger TRG2
3 before insert on t2
4 for each row
5 when ( sys_context('USERENV','SID') = 0 )
6 begin
7 :new.x := 0;
8 end;
9 /
Trigger created.
I’m using an always false condition so the content of the trigger will never be fired (except for the WHEN clause and the IF-test). Now I’m ready to slam a bunch of inserts into each table and measure the performance.
SQL> set timing on
SQL> insert into t1
2 select 1 from dual
3 connect by level <= 1000000;
1000000 rows created.
Elapsed: 00:00:02.52
SQL> insert into t2
2 select 1 from dual
3 connect by level <= 1000000;
1000000 rows created.
Elapsed: 00:00:00.41
There is an immediate urge here to go screaming from the roof tops that WHEN is the all conquering hero of this benchmark. And yes, it is indeed faster but make sure you keep the results in perspective. We gained back about 2 seconds for 1 million inserts. For me, once I’m inserting millions of rows into a table I’m starting to think not about trigger performance but whether this is the kind of table I want to be having triggers on at all.
That’s interesting :). And yes, true, this is indeed an important consideration whether you need trigger on such tables.
Regards,
Sanjeeva