Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8   вперед  Ctrl      все
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
кстати, я могу в тригере нарисовать создание "партиции" и создавать их по мере надобности автоматом.
а в дб2 есть тригеры на вью ?
DDL в instead of tirgger? Или в другом каком?
Instead of triggers в db2.
7 ноя 10, 21:31    [9738864]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
Mark Barinstein
Да, наверное можно.
Только это целую программу в instead of update придётся написать, чтоб корректно обработать возможное перемещение строки из партиции в другую партицию.

ну да, одну-две минуты придется потратить на каждый тригер, не вижу в этом проблему.
Тогда это не займёт у вас много времени.
Наришите, пожалуйста, тогда instead of update триггер для, скажем , 12 партиций:
- 1-я: за январь 2010 и раньше
- 10 остальных, по месяцу 2010-го, начиная с февраля
- последняя, за декабрь 2010 и дальше

а потом сравним элегантность решений - в db2 и вашего...
7 ноя 10, 22:04    [9738963]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Mark Barinstein

Тогда это не займёт у вас много времени.
Наришите, пожалуйста, тогда instead of update триггер для, скажем , 12 партиций:
- 1-я: за январь 2010 и раньше
- 10 остальных, по месяцу 2010-го, начиная с февраля
- последняя, за декабрь 2010 и дальше

а потом сравним элегантность решений - в db2 и вашего...


ну вот на это 3 минуты ушло
create or replace
TRIGGER tgr_partv_insert
INSTEAD OF INSERT
ON part_v
FOR EACH ROW
DECLARE
  m_table varchar2(7) ;  
  plsql_block varchar2(2000);
  
  m_id int;
  m_v varchar2(10);
  m_d date;
  
BEGIN
  m_table :='PART_12' ;
  if (to_char(:NEW.d,'yyyymm') <= '201001') then m_table:='PART_01';  end if ;
  if (to_char(:NEW.d,'yyyymm') <= '201012' and to_char(:NEW.d,'yyyymm')>='201002') then m_table:='PART_'||to_char(:NEW.d,'mm');  end if ;
  
  plsql_block:='insert into '|| m_table||' values (:m_id,:m_v,:m_d)';
  dbms_output.put_line(plsql_block);
  
  m_id:= :NEW.id;
  m_v := :NEW.v ;
  m_d := :NEW.d ;
  
  EXECUTE IMMEDIATE plsql_block USING IN OUT m_id, m_v, m_d;

END;

наверно можно было элегантней, но лень в доку лезть.

SQL> insert into part_v values (1,'shit',to_date('01.01.2010','dd.mm.yyyy')) ;
insert into PART_01 values (:m_id,:m_v,:m_d)

1 row created.

SQL> insert into part_v values (1,'shit',to_date('01.02.2010','dd.mm.yyyy')) ;
insert into PART_02 values (:m_id,:m_v,:m_d)

1 row created.

SQL> insert into part_v values (1,'shit',to_date('01.03.2010','dd.mm.yyyy')) ;
insert into PART_03 values (:m_id,:m_v,:m_d)

1 row created.

SQL> insert into part_v values (1,'shit',to_date('01.01.2009','dd.mm.yyyy')) ;
insert into PART_01 values (:m_id,:m_v,:m_d)

1 row created.

SQL> insert into part_v values (1,'shit',to_date('01.01.2011','dd.mm.yyyy')) ;
insert into PART_12 values (:m_id,:m_v,:m_d)

1 row created.

SQL> select * from part_01 ;

        ID V          D
---------- ---------- ------------------
         1 shit       01-JAN-10
         1 shit       01-JAN-09

SQL> select * from part_02 ;

        ID V          D
---------- ---------- ------------------
         1 shit       01-FEB-10

SQL> select * from part_03 ;

        ID V          D
---------- ---------- ------------------
         1 shit       01-MAR-10

SQL> select * from part_12 ;

        ID V          D
---------- ---------- ------------------
         1 shit       01-JAN-11

исходые данные
+

create table part_01 (id int not null, v varchar(10), d date not null) ;
create table part_02 (id int not null, v varchar(10), d date not null) ;
create table part_03 (id int not null, v varchar(10), d date not null) ;
create table part_04 (id int not null, v varchar(10), d date not null) ;
create table part_05 (id int not null, v varchar(10), d date not null) ;
create table part_06 (id int not null, v varchar(10), d date not null) ;
create table part_07 (id int not null, v varchar(10), d date not null) ;
create table part_08 (id int not null, v varchar(10), d date not null) ;
create table part_09 (id int not null, v varchar(10), d date not null) ;
create table part_10 (id int not null, v varchar(10), d date not null) ;
create table part_11 (id int not null, v varchar(10), d date not null) ;
create table part_12 (id int not null, v varchar(10), d date not null) ;

create view part_v as
select id, v, d from part_01
union all
select id, v, d from part_02
union all
select id, v, d from part_03
union all
select id, v, d from part_04
union all
select id, v, d from part_05
union all
select id, v, d from part_06
union all
select id, v, d from part_07
union all
select id, v, d from part_08
union all
select id, v, d from part_09
union all
select id, v, d from part_10
union all
select id, v, d from part_11
union all
select id, v, d from part_12;


попзжей включу PARTITION_VIEW_ENABLED, проверить план
8 ноя 10, 18:07    [9743996]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
ну вот на это 3 минуты ушло
Ладно, не буду вас больше мучать.
На самом деле, мне был интересен instead of update, а не instead of insert.
Я просто хотел, чтоб вы оценили длину кода:
В общем случае для instead of insert и delete у вас в каждом триггере для 12-и партиций должно было бы быть по 12 if (или case с 12-ю вариантами) для выяснения имени таблицы.
А в instead of update - по 1 такому case для старой и новой таблицы-партиции и дальше:
- если таблицы совпали, то update в ней
- если нет, то delete из старой, insert в новую
И каждый раз при attach / detach все три триггера переписываются (и это кроме манипуляций с view и таблицами).

А у меня вместо всего этого только манипуляции с view и таблицами:
- если добавляется новая или удаляется старая
create or replace view part_v ...
- если самую старую очищаем и используем для нового месяца:
alter table part_t1 drop constraint t1_c;
truncate table part_t1;
alter table part_t1 add constraint t1_c check (<новый диапазон>);

Немного элегантнее получается :)
8 ноя 10, 19:02    [9744245]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно.
8 ноя 10, 19:58    [9744448]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Warstone
Member

Откуда:
Сообщений: 4896
Блог
Yo.!
согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно.
Когда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?
9 ноя 10, 01:35    [9745304]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Warstone
Когда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?

если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.
9 ноя 10, 01:56    [9745327]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Warstone
Member

Откуда:
Сообщений: 4896
Блог
Yo.!
Warstone
Когда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?

если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.
И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает?
9 ноя 10, 08:36    [9745617]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Victor Metelitsa
Member

Откуда: Тюмень
Сообщений: 2559
Warstone
Yo.!
пропущено...

если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.
И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает?

Но и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки.
9 ноя 10, 09:00    [9745688]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Warstone
Member

Откуда:
Сообщений: 4896
Блог
Victor Metelitsa
Но и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки.
Не надо меня этим лечить, я сам так в Pg делаю. Просто Йо, до этого не додумался... Ну или скромно умолчал... Как всегда.
9 ноя 10, 10:12    [9746100]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
+ Результаты тестов на db2 9.7

create table part_01 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-01-01' and '2010-01-31')) in userspace1@
create table part_02 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-02-01' and '2010-02-28')) in userspace1@
create table part_03 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-03-01' and '2010-03-31')) in userspace1@
create table part_04 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-04-01' and '2010-04-30')) in userspace1@
create table part_05 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-05-01' and '2010-05-31')) in userspace1@
create table part_06 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-06-01' and '2010-06-30')) in userspace1@
create table part_07 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-07-01' and '2010-07-31')) in userspace1@
create table part_08 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-08-01' and '2010-08-31')) in userspace1@
create table part_09 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-09-01' and '2010-09-30')) in userspace1@
create table part_10 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-10-01' and '2010-10-31')) in userspace1@
create table part_11 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-11-01' and '2010-11-30')) in userspace1@
create table part_12 (id int not null, v varchar(10), d date not null, constraint t1_c check(d between '2010-12-01' and '2010-12-31')) in userspace1@

create or replace view part_v as
          select * from part_01
union all select * from part_02
union all select * from part_03
union all select * from part_04
union all select * from part_05
union all select * from part_06
union all select * from part_07
union all select * from part_08
union all select * from part_09
union all select * from part_10
union all select * from part_11
union all select * from part_12
with row movement@

create or replace view part_v2 as
          select * from part_01
union all select * from part_02
union all select * from part_03
union all select * from part_04
union all select * from part_05
union all select * from part_06
union all select * from part_07
union all select * from part_08
union all select * from part_09
union all select * from part_10
union all select * from part_11
union all select * from part_12
@

create or replace trigger part_v2_iu
instead of insert on part_v2
referencing new as n
for each row
begin
  declare stmt varchar(256);
  set stmt = 
  case 
    when n.d between '2010-01-01' and '2010-01-31' then '01'
    when n.d between '2010-02-01' and '2010-02-28' then '02'
    when n.d between '2010-03-01' and '2010-03-31' then '03'
    when n.d between '2010-04-01' and '2010-04-30' then '04'
    when n.d between '2010-05-01' and '2010-05-31' then '05'
    when n.d between '2010-06-01' and '2010-06-30' then '06'
    when n.d between '2010-07-01' and '2010-07-31' then '07'
    when n.d between '2010-08-01' and '2010-08-31' then '08'
    when n.d between '2010-09-01' and '2010-09-30' then '09'
    when n.d between '2010-10-01' and '2010-10-31' then '10'
    when n.d between '2010-11-01' and '2010-11-30' then '11'
    when n.d between '2010-12-01' and '2010-12-31' then '12'
    else raise_error('75001', n.d||': date is out of range')
  end;
  set stmt='insert into part_'||stmt||'(id, v, d) values (?, ?, ?)';
  prepare s1 from stmt;
  execute s1 using n.id, n.v, n.d;
end@

-- Временная таблица, из которой будем insert select делать
declare global temporary table session.data like part_v with replace on commit preserve rows not logged@
-- Заполняем её
insert into session.data (id, v, d)
with t(id) as (values 1 union all select id+1 from t where id<100000)
select id, 'row'||id v, date('2010-01-01') + (round(rand()*364)) days d from t@
-- Смотрим, что получилось
select year(d) y, month(d) m, count(1) c
from session.data 
group by rollup((year(d), month(d)))
order by y, m@

Y           M           C          
----------- ----------- -----------
       2010           1        8395
       2010           2        7517
       2010           3        8421
       2010           4        8334
       2010           5        8646
       2010           6        8220
       2010           7        8642
       2010           8        8571
       2010           9        8294
       2010          10        8477
       2010          11        8150
       2010          12        8333
          -           -      100000

-- Тест скорости вставки во view без instead of triggger
values current timestamp@
insert into part_v select * from session.data@
values current timestamp@

values current timestamp

1                         
--------------------------
2010-11-09-10.50.10.437000

  1 record(s) selected.


insert into part_v select * from session.data
DB20000I  The SQL command completed successfully.

values current timestamp

1                         
--------------------------
2010-11-09-10.50.12.203000

-- Вот что вставилось
select year(d) y, month(d) m, count(1) c
from part_v
group by rollup((year(d), month(d)))
order by y, m@

Y           M           C          
----------- ----------- -----------
       2010           1        8395
       2010           2        7517
       2010           3        8421
       2010           4        8334
       2010           5        8646
       2010           6        8220
       2010           7        8642
       2010           8        8571
       2010           9        8294
       2010          10        8477
       2010          11        8150
       2010          12        8333
          -           -      100000

-- Удаляем всё и на всякий реорганизуем таблицы
delete from part_v@
reorg table part_01@
reorg table part_02@
reorg table part_03@
reorg table part_04@
reorg table part_05@
reorg table part_06@
reorg table part_07@
reorg table part_08@
reorg table part_09@
reorg table part_10@
reorg table part_11@
reorg table part_12@

-- Тест всавки во view с instead of trigger
values current timestamp@
insert into part_v2 select * from session.data@
values current timestamp@


values current timestamp

1                         
--------------------------
2010-11-09-10.55.06.218000

  1 record(s) selected.


insert into part_v2 select * from session.data
DB20000I  The SQL command completed successfully.

values current timestamp

1                         
--------------------------
2010-11-09-10.55.33.156000

  1 record(s) selected.

-- Вставилось то же самое
select year(d) y, month(d) m, count(1) c
from part_v2
group by rollup((year(d), month(d)))
order by y, m@

Y           M           C          
----------- ----------- -----------
       2010           1        8395
       2010           2        7517
       2010           3        8421
       2010           4        8334
       2010           5        8646
       2010           6        8220
       2010           7        8642
       2010           8        8571
       2010           9        8294
       2010          10        8477
       2010          11        8150
       2010          12        8333
          -           -      100000
В итоге для db2 имеем для вставки insert select из временной таблицы для 100 000 записей (ноут, 1 ядро t1300 1.66 GHz, винт 5400 rpm):
- без instead of trigger: 2 сек
- с instead of trigger: 27 сек (процессор всё время занят на 100%)

А на оракле как дела обстоят?
9 ноя 10, 11:08    [9746569]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Без динамики в триггере удалось добиться прогресса.
+ Без динамики
create or replace trigger part_v2_iu2
instead of insert on part_v2
referencing new as n
for each row
begin 
  case 
    when n.d between '2010-01-01' and '2010-01-31' then insert into part_01(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-02-01' and '2010-02-28' then insert into part_02(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-03-01' and '2010-03-31' then insert into part_03(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-04-01' and '2010-04-30' then insert into part_04(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-05-01' and '2010-05-31' then insert into part_05(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-06-01' and '2010-06-30' then insert into part_06(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-07-01' and '2010-07-31' then insert into part_07(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-08-01' and '2010-08-31' then insert into part_08(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-09-01' and '2010-09-30' then insert into part_09(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-10-01' and '2010-10-31' then insert into part_10(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-11-01' and '2010-11-30' then insert into part_11(id, v, d) values (n.id, n.v, n.d);
    when n.d between '2010-12-01' and '2010-12-31' then insert into part_12(id, v, d) values (n.id, n.v, n.d);
    else signal sqlstate '75001' set message_text = 'Date is out of range';
  end case;
end@

values current timestamp

1                         
--------------------------
2010-11-09-11.52.40.859000

  1 record(s) selected.


insert into part_v2 select * from session.data
DB20000I  The SQL command completed successfully.

values current timestamp

1                         
--------------------------
2010-11-09-11.52.55.578000

  1 record(s) selected.

select year(d) y, month(d) m, count(1) c
from part_v2
group by rollup((year(d), month(d)))
order by y, m@

Y           M           C          
----------- ----------- -----------
       2010           1        8395
       2010           2        7517
       2010           3        8421
       2010           4        8334
       2010           5        8646
       2010           6        8220
       2010           7        8642
       2010           8        8571
       2010           9        8294
       2010          10        8477
       2010          11        8150
       2010          12        8333
          -           -      100000
но всё равно: 15 сек против 2-х...
9 ноя 10, 11:59    [9746964]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!

исходые данные
+
+

create table part_01 (id int not null, v varchar(10), d date not null) ;
create table part_02 (id int not null, v varchar(10), d date not null) ;
create table part_03 (id int not null, v varchar(10), d date not null) ;
create table part_04 (id int not null, v varchar(10), d date not null) ;
create table part_05 (id int not null, v varchar(10), d date not null) ;
create table part_06 (id int not null, v varchar(10), d date not null) ;
create table part_07 (id int not null, v varchar(10), d date not null) ;
create table part_08 (id int not null, v varchar(10), d date not null) ;
create table part_09 (id int not null, v varchar(10), d date not null) ;
create table part_10 (id int not null, v varchar(10), d date not null) ;
create table part_11 (id int not null, v varchar(10), d date not null) ;
create table part_12 (id int not null, v varchar(10), d date not null) ;

create view part_v as
select id, v, d from part_01
union all
select id, v, d from part_02
union all
select id, v, d from part_03
union all
select id, v, d from part_04
union all
select id, v, d from part_05
union all
select id, v, d from part_06
union all
select id, v, d from part_07
union all
select id, v, d from part_08
union all
select id, v, d from part_09
union all
select id, v, d from part_10
union all
select id, v, d from part_11
union all
select id, v, d from part_12;


попзжей включу PARTITION_VIEW_ENABLED, проверить план
Вы забыли в коде либо check constraint в каждой таблице, либо в каждом select во view указать where, либо всё это сразу (я не знаю, как там ораклу надо).
А то боюсь, что без этого оракл partition elimination не будет делать - ему неоткуда такую информацию взять будет...
9 ноя 10, 12:09    [9747061]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Warstone
И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает?

нет конечно, оракл не способен отличить откуда пришел SQL, из хранимки, с клиента или динамический из хранимки. я импользовал биндинг переменных, поэтому максимум 12 запросов распарсится, после чего эти 12 планов закрепяться в кеше.

Mark Barinstein
В итоге для db2 имеем для вставки insert select из временной таблицы для 100 000 записей (ноут, 1 ядро t1300 1.66 GHz, винт 5400 rpm):
- без instead of trigger: 2 сек
- с instead of trigger: 27 сек (процессор всё время занят на 100%)

А на оракле как дела обстоят?

мне сравнить не с чем. но даже если в оракле та же картина не вижу преимущества, все время появляется из-за того, что запускается интерпритатор языка сторед процедур, а в реальной жизни по любому там будет туча логики и эти 3 строчки тригера на фоне остальной логики никакой погоды уже не сделают.
вы там рассказывали, что легко сделаете логгинг для эмуляции фрешбэк, ну давайте хотя бы такую "логику" добавим и сравним на сколько инстеад усугубил в этом случае.
9 ноя 10, 12:14    [9747109]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Mark Barinstein

Вы забыли в коде либо check constraint в каждой таблице, либо в каждом select во view указать where, либо всё это сразу (я не знаю, как там ораклу надо).
А то боюсь, что без этого оракл partition elimination не будет делать - ему неоткуда такую информацию взять будет...

да, констреинты нужны, я еще думал параметер включать нужно, а он по дефолту включен. все работает (FILTER = partition elimination)
SQL> select * from part_v where d = '01-JAN-2010' ;

        ID V          D
---------- ---------- ------------------
         1 shit       01-JAN-10


Execution Plan
----------------------------------------------------------
Plan hash value: 1777321016

----------------------------------------------------------------------------------------------
| Id  | Operation                      | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |             |     1 |    16 |     2   (0)| 00:00:01 |
|   1 |  VIEW                          | PART_V      |     1 |    16 |     2   (0)| 00:00:01 |
|   2 |   UNION-ALL PARTITION          |             |       |       |            |          |
|   3 |    TABLE ACCESS BY INDEX ROWID | PART_01     |     1 |    16 |     2   (0)| 00:00:01 |
|*  4 |     INDEX RANGE SCAN           | PART_IDX_01 |     1 |       |     1   (0)| 00:00:01 |
|*  5 |    FILTER                      |             |       |       |            |          |
|   6 |     TABLE ACCESS BY INDEX ROWID| PART_02     |     1 |    16 |     2   (0)| 00:00:01 |
|*  7 |      INDEX RANGE SCAN          | PART_IDX_02 |     1 |       |     1   (0)| 00:00:01 |
|*  8 |    FILTER                      |             |       |       |            |          |
|   9 |     TABLE ACCESS BY INDEX ROWID| PART_03     |     1 |    29 |     1   (0)| 00:00:01 |
|* 10 |      INDEX RANGE SCAN          | PART_IDX_03 |     1 |       |     1   (0)| 00:00:01 |
|* 11 |    FILTER                      |             |       |       |            |          |
|  12 |     TABLE ACCESS BY INDEX ROWID| PART_04     |     1 |    16 |     2   (0)| 00:00:01 |
|* 13 |      INDEX RANGE SCAN          | PART_IDX_04 |     1 |       |     1   (0)| 00:00:01 |
|* 14 |    FILTER                      |             |       |       |            |          |
|  15 |     TABLE ACCESS BY INDEX ROWID| PART_05     |     1 |    29 |     1   (0)| 00:00:01 |
|* 16 |      INDEX RANGE SCAN          | PART_IDX_05 |     1 |       |     1   (0)| 00:00:01 |
|* 17 |    FILTER                      |             |       |       |            |          |
|  18 |     TABLE ACCESS BY INDEX ROWID| PART_06     |     1 |    29 |     1   (0)| 00:00:01 |
|* 19 |      INDEX RANGE SCAN          | PART_IDX_06 |     1 |       |     1   (0)| 00:00:01 |
|* 20 |    FILTER                      |             |       |       |            |          |
|  21 |     TABLE ACCESS BY INDEX ROWID| PART_07     |     1 |    29 |     1   (0)| 00:00:01 |
|* 22 |      INDEX RANGE SCAN          | PART_IDX_07 |     1 |       |     1   (0)| 00:00:01 |
|* 23 |    FILTER                      |             |       |       |            |          |
|  24 |     TABLE ACCESS BY INDEX ROWID| PART_08     |     1 |    29 |     1   (0)| 00:00:01 |
|* 25 |      INDEX RANGE SCAN          | PART_IDX_08 |     1 |       |     1   (0)| 00:00:01 |
|* 26 |    FILTER                      |             |       |       |            |          |
|  27 |     TABLE ACCESS BY INDEX ROWID| PART_09     |     1 |    29 |     1   (0)| 00:00:01 |
|* 28 |      INDEX RANGE SCAN          | PART_IDX_09 |     1 |       |     1   (0)| 00:00:01 |
|* 29 |    FILTER                      |             |       |       |            |          |
|  30 |     TABLE ACCESS BY INDEX ROWID| PART_10     |     1 |    29 |     1   (0)| 00:00:01 |
|* 31 |      INDEX RANGE SCAN          | PART_IDX_10 |     1 |       |     1   (0)| 00:00:01 |
|* 32 |    FILTER                      |             |       |       |            |          |
|  33 |     TABLE ACCESS BY INDEX ROWID| PART_11     |     1 |    29 |     1   (0)| 00:00:01 |
|* 34 |      INDEX RANGE SCAN          | PART_IDX_11 |     1 |       |     1   (0)| 00:00:01 |
|* 35 |    FILTER                      |             |       |       |            |          |
|  36 |     TABLE ACCESS BY INDEX ROWID| PART_12     |     1 |    16 |     2   (0)| 00:00:01 |
|* 37 |      INDEX RANGE SCAN          | PART_IDX_12 |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

9 ноя 10, 12:27    [9747235]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
мне сравнить не с чем. но даже если в оракле та же картина не вижу преимущества, все время появляется из-за того, что запускается интерпритатор языка сторед процедур, а в реальной жизни по любому там будет туча логики и эти 3 строчки тригера на фоне остальной логики никакой погоды уже не сделают.

А вы сравните со вставкой в непартиционированную таблицу:
+ Вставка в непартиционированную
create table part_all (id int not null, v varchar(10), d date not null) in userspace1@

values current timestamp@
insert into part_all select * from session.data@
values current timestamp@

values current timestamp

1                         
--------------------------
2010-11-09-12.19.33.984000

  1 record(s) selected.


insert into part_all select * from session.data
DB20000I  The SQL command completed successfully.

values current timestamp

1                         
--------------------------
2010-11-09-12.19.35.703000

select year(d) y, month(d) m, count(1) c
from part_all
group by rollup((year(d), month(d)))
order by y, m@

Y           M           C          
----------- ----------- -----------
       2010           1        8395
       2010           2        7517
       2010           3        8421
       2010           4        8334
       2010           5        8646
       2010           6        8220
       2010           7        8642
       2010           8        8571
       2010           9        8294
       2010          10        8477
       2010          11        8150
       2010          12        8333
          -           -      100000
У меня - 1.7 сек.
Про тучи логики в реальной жизни не буду комментировать - жизнь у каждой стстемы своя...
9 ноя 10, 12:27    [9747236]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Mark Barinstein

А вы сравните со вставкой в непартиционированную таблицу:

а какой смысл ? тогда уж более спортивно было бы сравнивать с партициированной по взрослому. но мне лень, коню ясно, что быстрей чем если бы вы для этого вью flashback пытались бы проэмулировать.
9 ноя 10, 12:45    [9747374]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
Mark Barinstein

А вы сравните со вставкой в непартиционированную таблицу:

а какой смысл ? тогда уж более спортивно было бы сравнивать с партициированной по взрослому. но мне лень, коню ясно, что быстрей чем если бы вы для этого вью flashback пытались бы проэмулировать.
Не мешайте вместе мух (флешбек) и котлеты (партиционирование), они не связаны друг с другом.
Давайте рассмотрим цель партиционирования: ускорить работу с большой таблицей путём разбиения её на части, чтобы в зависимости от предиката оно лезло только в часть таблицы, а не во всю.
И если из такой таблицы надо делать только чтения, то мы увидим выгоду от этого и в дб2, и в оракле.
Но в реальности такую таблицу надо и обновлять, а здесь у оракла могут быть серьёзные проблемы. И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей.

Что до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. Флешбековые запросы я делаю из этой исторической таблицы, а не из основной.
Массовые обновления у меня (ну, может, кроме insert) - это действительно тяжёлая операция, которой лучше избегать (update текущей записи и, если это update, то insert новой).
Но на паре сотен затронутых записей не так долго и работает, хотя разницу видно хорошо.
9 ноя 10, 14:35    [9748369]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
2 Mark Barinstein


автор
Что до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. Флешбековые запросы я делаю из этой исторической таблицы, а не из основной.


Простите, я не совсем понял. В дб2 нет возможности:

CREATE PARTITION FUNCTION...
GO

CREATE PARTITION SCHEME...
GO

CREATE TABLE \ INDEX  ... ON partition_scheme_name ( partition_column_name ) ...

?
9 ноя 10, 14:56    [9748547]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
2pkarklin

речь про партитионинг для бедных, которые не тянут EE edition. кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ?
9 ноя 10, 15:10    [9748723]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Yo.!
кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ?


Тока Partitioned Views. Есть во всех редакциях.
9 ноя 10, 15:18    [9748814]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Yo.!
Guest
Mark Barinstein
И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей.

ну это у вас воображение разыгралось, столь примитивный тригер как-то повлиять на "выгоды" не сможет.
еще раз, мой поинт в том, что в реальной задаче по любому будет тригер обрабатывать входные данные + хотя бы базовые аудитные записи оставить. 4 "лишних" строчки в этом тригере добавят не более 10%.

Mark Barinstein
Что до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами.

вот и давайте посмотрим как эти 3 тригера повлияют на разницу. добавте в партицированную и во вью эти тригера и будет ли заметна разница теперь. я думаю не особо.
9 ноя 10, 15:23    [9748857]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Mark Barinstein
Member

Откуда: Москва
Сообщений: 5032
Yo.!
Mark Barinstein
И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей.

ну это у вас воображение разыгралось, столь примитивный тригер как-то повлиять на "выгоды" не сможет.
еще раз, мой поинт в том, что в реальной задаче по любому будет тригер обрабатывать входные данные + хотя бы базовые аудитные записи оставить. 4 "лишних" строчки в этом тригере добавят не более 10%.
Да не сравниваем мы здесь флешбек, выключите его у себя! :)
Ну вот, а теперь вспомните свои незачёты за какие-то копеечные накладные расходы на fenced java функции, лишние io на функциональные индексы.
Вот если где и ставить незачёт, так вот за эти "4 лишних строчки", которые у меня ухудшили производительность запроса в 7 и 13 раз.
дб2-шной fenced java и функциональным индексам никогда не удастся так запрос ухудшить. :)
9 ноя 10, 16:27    [9749439]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
Mark Barinstein
Да не сравниваем мы здесь флешбек, выключите его у себя! :)
Никак нельзя нащальника! Это святой кароф любый оракдиста

ЗЫ. Толку-то от этого флэшбэка...
10 ноя 10, 16:33    [9756207]     Ответить | Цитировать Сообщить модератору
 Re: Oracle XE: a five years of no progress  [new]
RENaissance
Member

Откуда: Муром->Москва
Сообщений: 10895
Senya_L

ЗЫ. Толку-то от этого флэшбэка...

Реально увеличивает размер члена в споре "Кто круче".
11 ноя 10, 09:11    [9758570]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить