Стала интересна разница в подходах, решил померить перфомансы Матвьюха | Код | create table od_drugs_mv(field1 varchar2(100),field2 varchar2(100),field3 varchar2(100)); insert into od_drugs_mv select sys_guid(),sys_guid(),sys_guid() from dual connect by level <=1500000; commit; create materialized view log on od_drugs_mv with sequence,rowid (field1,field2,field3) including new values; create materialized view pre_otd_drugs_mw refresh fast on commit as select field1,field2,field3,count(*) cnt from od_drugs_mv group by field1,field2,field3;
|
Триггерная логика: | Код | create table od_drugs_trg as select * from od_drugs_mv; create table pre_otd_drugs_trg as select * from pre_otd_drugs_mw; create unique index pre_otd_drugs_trg$unc on pre_otd_drugs_trg('~'||field1,'~'||field2,'~'||field3);
create or replace trigger od_drugs_trg$aiud after insert or update or delete on od_drugs_trg for each row declare v_cnt pre_otd_drugs_trg.cnt%type; begin if updating or deleting then update pre_otd_drugs_trg set cnt = cnt-1 where '~'||field1 = '~'||:old.field1 and '~'||field2 = '~'||:old.field2 and '~'||field3 = '~'||:old.field3 returning cnt into v_cnt; if sql%rowcount != 1 then raise_application_error(-20777,'Потеряна согласованность данных'); end if; if v_cnt = 0 then delete from pre_otd_drugs_trg where '~'||field1 = '~'||:old.field1 and '~'||field2 = '~'||:old.field2 and '~'||field3 = '~'||:old.field3 and cnt = 0; end if; end if; if updating or inserting then update pre_otd_drugs_trg set cnt = cnt + 1 where '~'||field1 = '~'||:new.field1 and '~'||field2 = '~'||:new.field2 and '~'||field3 = '~'||:new.field3; if sql%rowcount = 0 then insert into pre_otd_drugs_trg values (:new.field1,:new.field2,:new.field3,1); end if; end if; end; /
|
Свободная от логики табла для примеру и табла с тестовыми данными | Код | create table od_drugs_free as select * from od_drugs_mv; create table test_data as select sys_guid() a ,sys_guid() b, sys_guid() c from dual connect by level <=100000;
|
тесткейс | Код | prompt ------------------------------------------------------ prompt добавляем в пустую таблицу prompt ------------------------------------------------------ insert into od_drugs_free select * from test_data; commit; prompt ------------------------------------------------------ prompt добавляем в таблицу с матвью prompt ------------------------------------------------------ insert into od_drugs_mv select * from test_data; commit; prompt ------------------------------------------------------ prompt добавляем в таблицу с триггером prompt ------------------------------------------------------ insert into od_drugs_trg select * from test_data; commit;
|
1 прогон - добавление новых данных | Код | Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0
------------------------------------------------------ добавляем в пустую таблицу ------------------------------------------------------ 100000 rows inserted Executed in 0.547 seconds Commit complete Executed in 0.062 seconds ------------------------------------------------------ добавляем в таблицу с матвью ------------------------------------------------------ 100000 rows inserted Executed in 9.75 seconds Commit complete Executed in 6.765 seconds ------------------------------------------------------ добавляем в таблицу с триггером ------------------------------------------------------ 100000 rows inserted Executed in 15.86 seconds Commit complete Executed in 0 seconds
|
имеем 9.75 + 6.765 = 16.515 на матвью против 15.86 триггером 2 прогон - добавление существующих данных | Код | Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 ------------------------------------------------------ добавляем в пустую таблицу ------------------------------------------------------ 100000 rows inserted Executed in 0.484 seconds Commit complete Executed in 0.109 seconds ------------------------------------------------------ добавляем в таблицу с матвью ------------------------------------------------------ 100000 rows inserted Executed in 11.25 seconds Commit complete Executed in 9.313 seconds ------------------------------------------------------ добавляем в таблицу с триггером ------------------------------------------------------ 100000 rows inserted Executed in 8.781 seconds Commit complete Executed in 0.016 seconds
|
имеем 11.25 + 9.313 = 20.563 на матвью против 8.781 триггером Получается триггерная логика имеет таки некоторые преимущества по производительности. Это сообщение отредактировал(а) Zloxa - 17.5.2011, 12:51
--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка 
|