Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Konsolidasi beberapa pemicu Oracle. Adakah dampak kinerja?

Saya sekarang telah membandingkan situasi ini dan saya sampai pada kesimpulan bahwa ada penurunan kinerja yang signifikan kemungkinan besar karena sakelar konteks PL/SQL, ketika menambahkan 1 pemicu. Kerugiannya adalah dengan faktor 8 di benchmark saya. Menambahkan pemicu "kompatibel" kedua, bagaimanapun, tidak memiliki dampak yang signifikan lagi. Dengan "kompatibel", maksud saya kedua pemicu selalu diaktifkan pada peristiwa yang sama dalam urutan apa pun.

Jadi saya menyimpulkan bahwa kemungkinan besar hanya ada 1 SQL -> PL/SQL sakelar konteks untuk semua pemicu

Berikut benchmarknya:

Buat tabel

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

... dan urutan

CREATE SEQUENCE s_test;

ID setelan pemicu biasa, pengguna/tanggal pembuatan/modifikasi

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;

Masukkan 1000, 10000, 100000 Catatan

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;

Hasil

-- ------------------------------------
-- +000000000 00:00:00.086603000
-- +000000000 00:00:00.844333000
-- +000000000 00:00:08.429186000
-- ------------------------------------

Pemicu "kompatibel" lainnya (urutan eksekusi tidak relevan)

CREATE OR REPLACE TRIGGER t_test_other BEFORE INSERT OR UPDATE
  ON test
  FOR EACH ROW
BEGIN
  :new.data := 42;
END t_test_other;

Hasil menjalankan skrip pengujian lainnya

-- ------------------------------------
-- +000000000 00:00:00.088551000
-- +000000000 00:00:00.876028000
-- +000000000 00:00:08.731345000
-- ------------------------------------

Nonaktifkan pemicu

alter trigger t_test disable;
alter trigger t_test_other disable;

Jalankan skrip pengujian yang sedikit berbeda

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;

Hasil

-- ------------------------------------
-- +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. Tidak dapat terhubung ke Oracle melalui VBA - SQLSetConnectAttr Driver Gagal

  2. Lewati SELECT STATEMENT sebagai parameter IN ke prosedur dan jalankan di Oracle

  3. Bagaimana cara membatasi jumlah baris yang dikembalikan dari Oracle di tingkat sumber data JDBC?

  4. Buat tabel dalam prosedur

  5. Oracle Mengonversi Baris ke Kolom