Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

कई Oracle ट्रिगर्स को समेकित करें। कोई प्रदर्शन प्रभाव?

मैंने अब इस स्थिति को बेंचमार्क कर दिया है और मैं इस निष्कर्ष पर पहुंचा हूं कि 1 ट्रिगर जोड़ते समय पीएल/एसक्यूएल संदर्भ स्विच के कारण एक महत्वपूर्ण प्रदर्शन हानि होने की संभावना है। मेरे बेंचमार्क में फ़ैक्टर 8 से नुकसान हुआ है। हालांकि, दूसरा "संगत" ट्रिगर जोड़ने से अब कोई महत्वपूर्ण प्रभाव नहीं पड़ता है। "संगत" से मेरा मतलब है कि दोनों ट्रिगर हमेशा एक ही घटना में किसी भी क्रम में सक्रिय होते हैं।

इसलिए मैं यह निष्कर्ष निकाल रहा हूं कि केवल 1 SQL -> PL/SQL होने की संभावना है सभी ट्रिगर के लिए प्रसंग स्विच

ये रहा बेंचमार्क:

टेबल बनाएं

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

... और एक क्रम

CREATE SEQUENCE s_test;

एक सामान्य ट्रिगर सेटिंग आईडी, निर्माण/संशोधन उपयोगकर्ता/तिथि

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;

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;

परिणाम

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

एक और "संगत" ट्रिगर (निष्पादन आदेश अप्रासंगिक)

प्रत्येक ROWBEGIN :new.data :=42;END t_test_other; के लिए परीक्षण पर डालने या अपडेट करने से पहले
CREATE OR REPLACE TRIGGER t_test_other BEFORE INSERT OR UPDATE
  ON test
  FOR EACH ROW
BEGIN
  :new.data := 42;
END t_test_other;

परीक्षण स्क्रिप्ट के एक और रन के परिणाम

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

ट्रिगर निष्क्रिय करें

alter trigger t_test disable;
alter trigger t_test_other disable;

थोड़ी अलग परीक्षण स्क्रिप्ट चलाएँ

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;

परिणाम

-- ------------------------------------
-- +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. Oracle के लिए JDBC में क्लाइंट जानकारी सेट करना

  2. Oracle XE क्वेरी लॉग

  3. दो तालिकाओं के बीच अंतर की पहचान करने का सबसे तेज़ तरीका?

  4. Oracle sql सम्मिलित करने और हटाने के लिए विलय करता है लेकिन अद्यतन नहीं करता है

  5. ओरेकल डेटाबेस का उपयोग करने के लिए जेपीए2 फीचर पैक के साथ वेबस्पेयर एप्लिकेशन सर्वर पर जेबीपीएम 5.4 कंसोल सर्वर युद्ध को तैनात करने में समस्या