powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Oracle XE: a five years of no progress
25 сообщений из 200, страница 5 из 8
Oracle XE: a five years of no progress
    #36941186
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!кстати, я могу в тригере нарисовать создание "партиции" и создавать их по мере надобности автоматом.
а в дб2 есть тригеры на вью ?DDL в instead of tirgger? Или в другом каком?
Instead of triggers в db2 .
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36941204
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!Mark BarinsteinДа, наверное можно.
Только это целую программу в instead of update придётся написать, чтоб корректно обработать возможное перемещение строки из партиции в другую партицию.

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

а потом сравним элегантность решений - в db2 и вашего...
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943165
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Тогда это не займёт у вас много времени.
Наришите, пожалуйста, тогда instead of update триггер для, скажем , 12 партиций:
- 1-я: за январь 2010 и раньше
- 10 остальных, по месяцу 2010-го, начиная с февраля
- последняя, за декабрь 2010 и дальше

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

ну вот на это 3 минуты ушло
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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;

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
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, проверить план
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943311
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 (<новый диапазон>);

Немного элегантнее получается :)
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943453
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943816
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!согласен, чуть элегантней но не принципиально. в instead of update будет один if с проверкой и 3 динамических SQL ну еще 3 минуты кодирования. я бы не увидел особого преимущества и если бы на пару часов кодирования была бы разница, главное что работать это дело будет так же эффективно.Когда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943824
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WarstoneКогда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?
если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943928
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!WarstoneКогда это Динамический SQL = Статическому SQL по быстроте?? Такие вещи как Планы выполнения и их кеширование и т.д. - давным давно отменили-что-ли?
если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36943954
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WarstoneYo.!пропущено...

если речь о кешировании и планах то Динамический SQL = Статическому, думаю с рождения.И оптимизация планов выполнения запросов, проводимая каждый раз при вставки одной записи, на себя ничего, конечно, не отъедает?
Но и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944089
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНо и заниматься таким было не обязательно. Если вы делаете N похожих таблиц, VIEW и триггер над ними, разумно написать скрипт, генерирующий, кроме DDL таблиц и view, код триггера, а не генерировать SQL в триггере. Да, получится длинный уродливый текст с огромным количеством IF, но вручную его писать не нужно. а будет ли этот явный код медленнее, чем то, что DB2 неявно сделает внутри себя - это вопрос, требующий проверки.Не надо меня этим лечить, я сам так в Pg делаю. Просто Йо, до этого не додумался... Ну или скромно умолчал... Как всегда.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944296
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Результаты тестов на db2 9.7
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
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%)

А на оракле как дела обстоят?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944423
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Без динамики в триггере удалось добиться прогресса.
Без динамики
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
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-х...
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944460
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 не будет делать - ему неоткуда такую информацию взять будет...
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944479
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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 строчки тригера на фоне остальной логики никакой погоды уже не сделают.
вы там рассказывали, что легко сделаете логгинг для эмуляции фрешбэк, ну давайте хотя бы такую "логику" добавим и сравним на сколько инстеад усугубил в этом случае.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944524
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
Вы забыли в коде либо check constraint в каждой таблице, либо в каждом select во view указать where, либо всё это сразу (я не знаю, как там ораклу надо).
А то боюсь, что без этого оракл partition elimination не будет делать - ему неоткуда такую информацию взять будет...
да, констреинты нужны, я еще думал параметер включать нужно, а он по дефолту включен. все работает (FILTER = partition elimination)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
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  |
----------------------------------------------------------------------------------------------

...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944525
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!мне сравнить не с чем. но даже если в оракле та же картина не вижу преимущества, все время появляется из-за того, что запускается интерпритатор языка сторед процедур, а в реальной жизни по любому там будет туча логики и эти 3 строчки тригера на фоне остальной логики никакой погоды уже не сделают.
А вы сравните со вставкой в непартиционированную таблицу:
Вставка в непартиционированную
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
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 сек.
Про тучи логики в реальной жизни не буду комментировать - жизнь у каждой стстемы своя...
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944579
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein
А вы сравните со вставкой в непартиционированную таблицу:

а какой смысл ? тогда уж более спортивно было бы сравнивать с партициированной по взрослому. но мне лень, коню ясно, что быстрей чем если бы вы для этого вью flashback пытались бы проэмулировать.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36944955
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!Mark Barinstein
А вы сравните со вставкой в непартиционированную таблицу:

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

Что до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами. Флешбековые запросы я делаю из этой исторической таблицы, а не из основной.
Массовые обновления у меня (ну, может, кроме insert) - это действительно тяжёлая операция, которой лучше избегать (update текущей записи и, если это update, то insert новой).
Но на паре сотен затронутых записей не так долго и работает, хотя разницу видно хорошо.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36945031
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Mark Barinstein


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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE PARTITION FUNCTION...
GO

CREATE PARTITION SCHEME...
GO

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

?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36945090
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2pkarklin

речь про партитионинг для бедных, которые не тянут EE edition. кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ?
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36945117
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!кстати, а что мсскл может предложить для стандарт едишено на тему партитионинга ?

Тока Partitioned Views. Есть во всех редакциях.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36945132
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей.

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

Mark BarinsteinЧто до моего флешбека, то я не использую там вью, я просто веду историческую таблицу тремя триггерами.
вот и давайте посмотрим как эти 3 тригера повлияют на разницу. добавте в партицированную и во вью эти тригера и будет ли заметна разница теперь. я думаю не особо.
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36945371
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Yo.!Mark Barinstein И накладные расходы на обновление могут убить все выгоды партиционирования по сравнению с непартиционированной таблицой - вот почему я прошу сравнивать с непартиционированной таблицей.
ну это у вас воображение разыгралось, столь примитивный тригер как-то повлиять на "выгоды" не сможет.
еще раз, мой поинт в том, что в реальной задаче по любому будет тригер обрабатывать входные данные + хотя бы базовые аудитные записи оставить. 4 "лишних" строчки в этом тригере добавят не более 10%. Да не сравниваем мы здесь флешбек, выключите его у себя! :)
Ну вот, а теперь вспомните свои незачёты за какие-то копеечные накладные расходы на fenced java функции, лишние io на функциональные индексы.
Вот если где и ставить незачёт, так вот за эти "4 лишних строчки", которые у меня ухудшили производительность запроса в 7 и 13 раз.
дб2-шной fenced java и функциональным индексам никогда не удастся так запрос ухудшить. :)
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36947838
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mark BarinsteinДа не сравниваем мы здесь флешбек, выключите его у себя! :)Никак нельзя нащальника! Это святой кароф любый оракдиста

ЗЫ. Толку-то от этого флэшбэка...
...
Рейтинг: 0 / 0
Oracle XE: a five years of no progress
    #36948645
RENaissance
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L
ЗЫ. Толку-то от этого флэшбэка...
Реально увеличивает размер члена в споре "Кто круче".
...
Рейтинг: 0 / 0
25 сообщений из 200, страница 5 из 8
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / Oracle XE: a five years of no progress
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]