Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hợp nhất một số trình kích hoạt Oracle. Bất kỳ tác động đến hiệu suất?

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
-- ------------------------------------


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để CẬP NHẬT một cột bằng cách sử dụng một cột khác trong bảng khác? Lỗi SQL:ORA-00933:Lệnh SQL không kết thúc đúng cách

  2. Cơ sở dữ liệu Oracle được xây dựng sẵn để học và thử nghiệm bằng Oracle Developer VM

  3. Sắp xếp theo ngày trong tuần từ thứ 2 đến chủ nhật

  4. Cách bật tính năng theo dõi trong ứng dụng oracle r12

  5. Kích hoạt để kiểm tra các bản sao