powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / какая ДБМС самая "шустрая" для выполнения хранимых процедур?
17 сообщений из 117, страница 5 из 5
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535054
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovmikronПусть будет кратчаяший путь. Это влият на уровень абстраккции?

Да. Для поиска кратчайшего пути есть вполне конкретная кляуза
connect by . И не надо
извращаться с ХП.

Прекрасно. Иммем таблицу которая содержит дуги графа. С1 - начальная точка, С2 - конечная точка, Ф(С3) - длина дуги.
Не могли бы вы привести пример кода, который исползует указанную конструкцию для поиска минималной длины.
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535060
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я в шоке. микрон написал вполне конкретный тест, который он попросил прогнать на разных серверах. Тест очень специфичный и очень заточен под его, микрона, задачи. Какого фига тут умничают и учат его жизни. Хотите помочь, перепешите тест на свой серевер и запустите. Млин. Обиженные ораклоиды уже достали. А пока, каша показала себя лучшей на это задаче.

Микрон , мне показалось очень странным, что операция округления занимает аж четверть процентов от общего времени. Как по мне, сложность это операции просто не сравнима по сложности вычислений с динамическим селектом. Я ожидал, что там будет от силы 1% но не как не столько много. Что-то тут не так, результат не коррелирует с реальностью. Есть предложение, дополнить вопрос на сайбезовом форуме и спросить - а фигли так? Просто твой инглиш не чета моему. Шо домаешь?
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535081
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldзаточен под его, микрона, задачи
Не "его задачи", а "его решение его задач". Если он предпочитает кривую ХП простому запросу...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535119
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, не нам решать за кривизну его вопроса. Он же сам написал, что тест у него синтетический, но характеризует его задачу.
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535126
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ggg_oldОн же сам написал, что тест у него синтетический, но характеризует его задачу.

Повторяю ещё раз, медленно: он характеризует не задачу, а его решение. Вероятно - кривое
решение.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535130
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldДмитрий, не нам решать за кривизну его вопроса. Он же сам написал, что тест у него синтетический, но характеризует его задачу.
издеваешься ?
Код: plaintext
1.
order by abs(c3 - v_j) 
exit when DBMS_RANDOM.VALUE() >  0 . 4 ;

в реальной задачи у него будет простенький джоин с
Код: plaintext
select level,round( 1000  * DBMS_RANDOM.VALUE(),  0 ) as v_j from dual CONNECT BY LEVEL <= 1000000 
где даже балк коллект/инсерт не понадобиться
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535181
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mikronВот попытался изобразить основной паттерн использования для Сайбейс АСА.
Давате мерятся, кто быстрее.
На АСА-12 25 секунд.
Код: plaintext
1.
2.
3.
...				
if rand() >  0 . 4  then
  leave lbl_each_t;
end if;
Не понимаю, как вы хотите интерпретировать результаты: этот тест будет на каждом новом запуске вставлять разные числа строк в GTT `t2`.
Впрочем, вот для Firebird 2.5 (под Win32), на старой рабочей станции P-IV 2.4MHZ c _наимерзейшим_ HDD и намеренно оставленным дефолтным Forced Writes = ON. Только кеш на коннект сделал 32 Mb (DefaultDBCache = 8192 вместо 75 страниц).
DDL:
Код: 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.
set term ^;
create or alter procedure my_test as begin end^ -- kill dependencies if any
set term ;^
commit;
recreate table
t1(c1 int not null, c2 int not null, c3 int not null, c4 int not null,
    primary key (c1, c4)
  );
create index t1i1 on t1(c1, c3, c2);
recreate global temporary table
  t2 (c1 int not null, c2 int not null, c3 int not null)
  on commit delete rows;
commit;
------------------
set term ^;
execute block as
declare i int= 1000 ;
declare j int;
begin
  while (i> 0 ) do begin
    j= 20 ;
    while (j> 0 ) do begin
      insert into t1(c1, c2, c3, c4)
      values(:i, round( 1000 *rand(), 0 ), round( 1000 *rand(), 0 ), :j);
      j=j- 1 ;
    end
    i=i- 1 ;
  end
end^
set term ;^
commit; -- 20'000 rows = 891 ms
--------------------
set term ^;
create or alter procedure my_test returns(t2_count int)
as
  declare p int;
  declare i int;
  declare j int;
  declare cur_c2 type of column t1.c2;
begin
  delete from t2;
  p = round( 1000  * rand(),  0 );
  i =  1000000 ;
  while (i> 0 ) do
  begin
    j=round( 1000 *rand(), 0 );
    for
      select first  10  c2
      from t1
      where c1 = :p
      order by abs(c3 - :j) desc
      into cur_c2
    do
    begin
      insert into t2 (c1, c2, c3) values(:p, :cur_c2, :j);
      if (cur_c2<>p) then
      begin
        p=cur_c2;
        if (rand()> 0 . 4 ) then
          leave;
      end
    end
    i=i- 1 ;
  end
  t2_count=(select count(*) from t2);
  suspend;
/* initial code:
  set @p = round(1000 * rand(), 0);
  set @i = 1000000;
  while @i > 0 loop
    set @j = round(1000 * rand(), 0);
  
lbl_each_t:
    for each_t as cur_t no scroll cursor for
          select top 10 c2 as @cur_c2
      from t1
      where c1 = @p
      order by abs(c3 - @j) desc
      do
      insert into t2 (c1, c2, c3)  values (@p, @cur_c2, @j);
      if @cur_c2 != @p then
        set @p = @cur_c2;
        if rand() > 0.4 then
          leave lbl_each_t;
        end if;
      end if;
    end for;
    set @i = @i - 1;
  end loop;
*/
end^
set term ;^
commit;
Testing:
(стабильно ~27 sec)
Код: 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.
C:\1INSTALL\FIREBIRD\Data>isql -n  localhost/3050:C:\1INSTALL\FIREBIRD\Data\TESTX.fdb
Database:  localhost/3050:C:\1INSTALL\FIREBIRD\Data\TESTX.fdb
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
        2053

Current memory = 35657984
Delta memory = 123484
Max memory = 35787776
Elapsed time= 28.32 sec
Buffers = 8192
Reads = 406
Writes 35
Fetches = 3061176
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
        1920

Current memory = 35657652
Delta memory = 8580
Max memory = 35788484
Elapsed time= 27.01 sec
Buffers = 8192
Reads = 4
Writes 28
Fetches = 3056873
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
         703

Current memory = 35654632
Delta memory = 5560
Max memory = 35788484
Elapsed time= 27.28 sec
Buffers = 8192
Reads = 0
Writes 11
Fetches = 3020616
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
       10047

Current memory = 35657228
Delta memory = 8156
Max memory = 35788484
Elapsed time= 26.77 sec
Buffers = 8192
Reads = 0
Writes 15
Fetches = 3030428

SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
        3359

Current memory = 35658076
Delta memory = 9004
Max memory = 35788908
Elapsed time= 27.07 sec
Buffers = 8192
Reads = 0
Writes 48
Fetches = 3098956
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
       13337

Current memory = 35654632
Delta memory = 5560
Max memory = 35788908
Elapsed time= 28.41 sec
Buffers = 8192
Reads = 0
Writes 5
Fetches = 3009588
SQL> set stat on; execute procedure my_test; set stat off; commit;

    T2_COUNT
============
        2100

Current memory = 35657668
Delta memory = 8580
Max memory = 35788908
Elapsed time= 28.22 sec
Buffers = 8192
Reads = 0
Writes 30
Fetches = 3059821
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535184
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitСделал вариант MyTest() с использованием прямого доступа вместо SQL. Скорость возросла на порядок.
TEST>do ##class(del.t1).MyTestDirect()
time=1.167889 s.
count=5636И конечно, при этом обеспечивается ACID, да ?
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535438
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovGgg_oldОн же сам написал, что тест у него синтетический, но характеризует его задачу.

Повторяю ещё раз, медленно: он характеризует не задачу, а его решение. Вероятно - кривое
решение.


Пусть будет кривое решение.
Если бы сияние вашего нимба и не заслоняло небесную сферу то можно было-бы заметит звёзды.

- вставка на оракле не играет большого значения на скорость. достаточно закомментировать в тесте инсерте.
- рекурсивный селект есть и в АСА. будь он применим, тест был бы другой.
- немного теории: алгортмы поиска по графу. вы покажете пример weighted A* реализовынай рекурсивным селектом?
(Его особенность, заклёчается в том, что поиск ведётся не строго в глубину по графуа в зависимости от наибольшего веса.
т.е. может быть сначала джоин с уровня 10, потом с уровня 5, затем с уровня 8, затем опять с 5)
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535448
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидНе понимаю, как вы хотите интерпретировать результаты: этот тест будет на каждом новом запуске вставлять разные числа строк в GTT `t2`.
Закон больших чисел. Тест выполняется достаточно большое кол-во раз.
К тому-же как вы заметили, кол-во вставок не велико, размер записи тоже маленкий, и коммита нет.
Спасибо за тест.
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37535456
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколько раз вы запускали свой тест ?
И еще: mikronи коммита нет.- я как раз использовал коммит для очистки GTT.
Правильно ли понимаю, что вы всё время добавляли новые данные в GTT'шку, а старые данные удаляли БЕЗ коммита ?
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37536257
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидservitСделал вариант MyTest() с использованием прямого доступа вместо SQL. Скорость возросла на порядок.
TEST>do ##class(del.t1).MyTestDirect()
time=1.167889 s.
count=5636И конечно, при этом обеспечивается ACID, да ? Да, при прямом доступе поддержка ACID является одной из характеристик
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37536341
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите глупому человеку, эту конструкцию
mikron
Код: plaintext
1.
2.
3.
	    for cur in (select q.c2 from 
        ( select c2 from t1 where c1 = v_p order by abs(c3 - v_j) desc ) q
...
          v_p := cur.c2;
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37536523
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitТаблоидпропущено...
И конечно, при этом обеспечивается ACID, да ? Да, при прямом доступе поддержка ACID является одной из характеристик
globals featuresBy using the various Cache' locking operations in conjunction with transactions, you can perform traditional ACID transactions using globals. <...> When using Object or SQ L access, transactions are handled automatically. Насколько я понимаю, при прямом доступе к глобалам обеспечить ACID можно, только заблокировав их. И не только от записи, но и от чтения, иначе dirty read.
Далее, вот фрагменты из вашего теста:
#1.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
ClassMethod Fill()
{
  set time=$zhorolog
  
  &sql(truncate table del.t1)
  
  for i= 1 : 1 : 1000  {
    for j= 1 : 1 : 20  {
      set c2=$random( 1000 )
      set c3=$random( 1000 )
      &sql(insert into del.t1(c1,c2,c3,c4) values(:i,:c2,:c3,:j))
    }
  }
  
  write "time=",$zhorolog-time," s.",!
}
Этот метод просто добавляет в таблицу-источник 20'000 строк, но тут нет "перекачки" данных в таблицу-времянку. Зачем ниже добавлена статистика по вызову только этого метода (TEST>do ##class(del.t1).Fill() time=.998096 s.) ?

#2
Код: 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.
[SIZE= 2 ]ClassMethod FillDirect()
{
  set time=$zhorolog
  
  do DISABLE^%NOJRN
  
  do ##class(del.t1).%KillExtent()
  
  set id= 0 
  for i= 1 : 1 : 1000  {
    for j= 1 : 1 : 20  {
      set id=id+ 1 
      set c2=$random( 1000 )
      set c3=$random( 1000 )
      set ^del.t1D(id)=$listbuild("",i,c2,c3,j)
      set ^del.t1I("i1",i,c3,c2,id)=""
    }
  }
  
  set ^del.t1D=id
  
  do ENABLE^%NOJRN
  
  write "time=",$zhorolog-time," s.",!
}[/SIZE]
- здесь также только загрузка 20'000 строк в глобал, но где основной цикл, в идёт котором "перекачка" данных во времянку ?
Кроме того, здесь предварительно отключено журналирование. А также нет тех самых "locking operations", которые и должны обеспечить ACID. Поэтому и такая скорость (TEST>do ##class(del.t1).FillDirect() time=.075046 s.).
А вот метод MyTest() уже вполне корректен. И скорость у него тоже адекватная - 13 сек.

ЗЫ. Кстати: на какой машине это выполнялось ?
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37536748
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид ,

Как видно, код автора состоит из двух частей:
заполнение таблицы исходными данными;

собственно сама процедура my_test, которую автору и было интересно проверить для разных СУБД.ТаблоидЗачем ниже добавлена статистика по вызову только этого метода (TEST>do ##class(del.t1).Fill() time=.998096 s.) ?Цифры для первого этапа приведены были для полноты картины.

Таблоидздесь также только загрузка 20\'000 строк в глобал, но где основной цикл, в идёт котором "перекачка" данных во времянку ?Это происходит в методах MyTest() и MyTestDirect().
Метод FillDirect() приведён был лишь для сравнения с Fill().

ТаблоидЗЫ. Кстати: на какой машине это выполнялось ?Приводилось.
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37537174
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servitЭто происходит в методах MyTest() и MyTestDirect().а, понятно: я не увидел тогда MyTestDirect. Так вопрос остается: как при работе этого MyTestDirect обеспечить:
1) чтобы разные коннекты писали данные в свои глобалы-"времянки" (аналоги GTT'шек в SQL), с полной невидимостью данных этих времянок для других коннектов ?
2) чтобы коннект_1 в процессе переносе данных из глобала t1 в t2 не видел изменений, которые в этом глобале происходят благодаря действиям других коннектов (также прямым доступом обращающихся к t1) ?
...
Рейтинг: 0 / 0
какая ДБМС самая "шустрая" для выполнения хранимых процедур?
    #37538085
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид1) чтобы разные коннекты писали данные в свои глобалы-"времянки" (аналоги GTT'шек в SQL), с полной невидимостью данных этих времянок для других коннектов ?Уже обеспечивается. GTT в СУБД Caché основывается на Process-private Globals
Таблоид2) чтобы коннект_1 в процессе переносе данных из глобала t1 в t2 не видел изменений, которые в этом глобале происходят благодаря действиям других коннектов (также прямым доступом обращающихся к t1) ?Используя блокировки , транзакции и другие команды. Подробнее в Transaction Processing
...
Рейтинг: 0 / 0
17 сообщений из 117, страница 5 из 5
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / какая ДБМС самая "шустрая" для выполнения хранимых процедур?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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