Bây giờ tôi đã đánh giá tình huống này và tôi đã đi đến kết luận rằng có một sự mất hiệu suất đáng kể rất có thể do chuyển mạch ngữ cảnh PL / SQL, khi thêm 1 trình kích hoạt. Sự mất mát là bởi hệ số 8 trong điểm chuẩn của tôi. Tuy nhiên, việc thêm trình kích hoạt "tương thích" thứ hai không còn tác động đáng kể nào nữa. Bởi "tương thích", ý tôi là cả hai trình kích hoạt luôn kích hoạt cùng một sự kiện theo bất kỳ thứ tự nào.
Vì vậy, tôi kết luận rằng rất có thể chỉ có 1 SQL -> PL/SQL
chuyển đổi ngữ cảnh cho tất cả các trình kích hoạt
Đây là điểm chuẩn:
Tạo bảng
-- A typical table with primary key, creation/modification user/date, and
-- other data columns
CREATE TABLE test(
id number(38) not null, -- pk
uc varchar2(400) not null, -- creation user
dc date not null, -- creation date
um varchar2(400), -- modification user
dm date, -- modification date
data number(38)
);
... và một chuỗi
CREATE SEQUENCE s_test;
ID cài đặt trình kích hoạt điển hình, ngày / người dùng tạo / sửa đổi
CREATE OR REPLACE TRIGGER t_test BEFORE INSERT OR UPDATE
ON test
FOR EACH ROW
BEGIN
IF inserting THEN
SELECT s_test.nextval INTO :new.id FROM dual;
:new.uc := USER;
:new.dc := SYSDATE;
:new.um := NULL;
:new.dm := NULL;
END IF;
IF updating THEN
:new.um := USER;
:new.dm := SYSDATE;
:new.uc := :old.uc;
:new.dc := :old.dc;
END IF;
END t_test;
Chèn bản ghi 1000, 10000, 100000
declare
procedure run (limit number) is
t timestamp;
begin
t := systimestamp;
insert into test (data)
select level from dual connect by level < limit;
dbms_output.put_line(to_char(systimestamp - t));
rollback;
end;
begin
run(1000);
run(10000);
run(100000);
end;
Kết quả
-- ------------------------------------
-- +000000000 00:00:00.086603000
-- +000000000 00:00:00.844333000
-- +000000000 00:00:08.429186000
-- ------------------------------------
Một trình kích hoạt "tương thích" khác (lệnh thực hiện không liên quan)
CREATE OR REPLACE TRIGGER t_test_other BEFORE INSERT OR UPDATE
ON test
FOR EACH ROW
BEGIN
:new.data := 42;
END t_test_other;
Kết quả của một lần chạy tập lệnh thử nghiệm khác
-- ------------------------------------
-- +000000000 00:00:00.088551000
-- +000000000 00:00:00.876028000
-- +000000000 00:00:08.731345000
-- ------------------------------------
Hủy kích hoạt trình kích hoạt
alter trigger t_test disable;
alter trigger t_test_other disable;
Chạy tập lệnh thử nghiệm hơi khác một chút
declare
procedure run (limit number) is
t timestamp;
begin
t := systimestamp;
insert into test (id, uc, dc, data)
select s_test.nextval, user, sysdate, level from dual
connect by level < limit;
dbms_output.put_line(to_char(systimestamp - t));
rollback;
end;
begin
run(1000);
run(10000);
run(100000);
end;
Kết quả
-- ------------------------------------
-- +000000000 00:00:00.012712000
-- +000000000 00:00:00.104903000
-- +000000000 00:00:01.043984000
-- ------------------------------------