Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ТРигер для проверки поступления новых записей 
:(
    Опции темы
Zloxa
Дата 17.5.2011, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Стала интересна разница в подходах, решил померить перфомансы

Матвьюха
Код

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 триггером  smile 

Получается триггерная логика имеет таки некоторые преимущества по производительности. 

Это сообщение отредактировал(а) Zloxa - 17.5.2011, 12:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 17.5.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Модификация ключа аггрегации
Код

SQL> update od_drugs_mv t
  2    set t.field3 = null
  3  where rownum <= 100000;
 
100000 rows updated
 
Executed in 23.625 seconds
SQL> commit;
 
Commit complete
 
Executed in 34.796 seconds
SQL> update od_drugs_trg t
  2    set t.field3 = null
  3  where rownum <= 100000;
 
100000 rows updated
 
Executed in 60.828 seconds


23.625+ 34.796 = 58.421 против 60.828 вообще не существенно  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.