sql >> Database teknologi >  >> RDS >> Oracle

Konsolider flere Oracle-udløsere. Enhver præstationspåvirkning?

Jeg har nu benchmarket denne situation, og jeg kom til den konklusion, at der er et betydeligt ydeevnetab højst sandsynligt på grund af PL/SQL-kontekstskift, når der tilføjes 1 trigger. Tabet er med faktor 8 i mit benchmark. Tilføjelse af en anden "kompatibel" trigger har dog ikke nogen væsentlig indflydelse længere. Med "kompatibel" mener jeg, at begge triggere altid udløses ved den samme begivenhed i vilkårlig rækkefølge.

Så jeg konkluderer, at der højst sandsynligt kun er 1 SQL -> PL/SQL kontekstskift for alle triggere

Her er benchmark:

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

... og en sekvens

CREATE SEQUENCE s_test;
 

Et typisk triggerindstillings-id, oprettelse/ændringsbruger/dato

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;
 

Indsæt 1000, 10000, 100000 poster

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;
 

Resultater

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

En anden "kompatibel" trigger (udførelsesordre er irrelevant)

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

Resultater af endnu en kørsel af testscriptet

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

Deaktiver triggere

alter trigger t_test disable;
alter trigger t_test_other disable;
 

Kør et lidt anderledes testscript

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;
 

Resultater

-- ------------------------------------ -- +000000000 00:00:00.012712000 -- +000000000 00:00:00.104903000 -- +000000000 00:00:01.043984000 -- ------------------------------------

  1. PostgreSQL Management og Automation med ClusterControl

  2. Hvad er de respektive fordele/begrænsninger ved Amazon RDS vs. EC2 med MySQL?

  3. Laravel Database Schema, Nullable Foreign

  4. Implementer forbindelsespooling i JDBC ved hjælp af apache dbcp