powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
6 сообщений из 6, страница 1 из 1
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32916231
Геша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
имеем

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
begin
declare sdevice integer;
set sdevice= 80702 ;
WITH RECURSIVE   HDev ( SerNo , pdeviceID,DeviceID ) 
AS (
      SELECT SerNo ,DeviceIDParent,Deviceid
         FROM device 
      WHERE  DeviceID=sDevice
       UNION ALL 
         SELECT d.Serno, d.DeviceIDParent,d.DeviceID
         FROM device d  INNER JOIN HDev  h ON d.DeviceID = h.pDeviceID 
           )
select  * from HDEv ;

end;

работает 0.291 секунды
и

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin 
declare did1 integer;
declare sno1 varchar( 30 ); 
declare p1 integer;
declare local temporary table t1 (did integer,sno varchar ( 30 ),pid integer);
set p1= 80702 ;
while p1 is not null LOOP
select  deviceid , serno , deviceIDParent 
into did1,sno1,p1
from device 
where deviceid=p1;
insert into t1(did,sno,pid)
values(did1,sno1,p1);
end loop;
select * from t1;


end;
работает 0.016 секунды
...
Рейтинг: 0 / 0
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32916278
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно сказать, что Вы хотите доказать этим тестом. Загоните в дерево миллиончик записей с неплохим и разветвленным уровнем вложенности и тогда уже сравнивайте тесты циклов и рекурсивных запросов, вытаскивая от всего дерева до его участков.
...
Рейтинг: 0 / 0
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32916385
Геша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ничего не хочу доказать , я констатирую факт ..
и записей в табличке около 100 тысяч .. и ветвление не больше 5 уровней (пока)..но вызовов одного из этих макросов - порядка 8 тысяч ..
и вытаскивать надо именно ветку дерева (найти одного из родителей ) ..
.. и задача не надуманная а конкретная ..
...
Рейтинг: 0 / 0
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32918145
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял, то в вашем запросе с циклом у каждого предка может быть только один потомок, ID которого заносится в переменную p1 на каждом шаге итерации.
Запрос с WITH REQURSIVE будет работать в ситуации, когда потомков у предка будет несколько (у вас стоит inner join). Если у предка всегда один потомок, попробуйте поиграться условием соединения изменив например его на left outer join, или соединение через where в подзапросе.

На моих тестах, запрос c with reqursive работал гораздо быстрее в деревьях с большим уровнем вложенности (тысячи), а на деревьях с маленьким уровнем вложенности работал не медленнее чем вылизанный запрос на циклах.
...
Рейтинг: 0 / 0
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32918212
Геша
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ggg_oldЕсли я правильно понял, то в вашем запросе с циклом у каждого предка может быть только один потомок, ID которого заносится в переменную p1 на каждом шаге итерации.
Запрос с WITH REQURSIVE будет работать в ситуации, когда потомков у предка будет несколько (у вас стоит inner join). Если у предка всегда один потомок, попробуйте поиграться условием соединения изменив например его на left outer join, или соединение через where в подзапросе.

На моих тестах, запрос c with reqursive работал гораздо быстрее в деревьях с большим уровнем вложенности (тысячи), а на деревьях с маленьким уровнем вложенности работал не медленнее чем вылизанный запрос на циклах.

Да нет тут не один потомок , а один родитель ..;-)
Задача стояла найти предка (определенного типа) , который не известно за сколько сучков от данного листика ..

Если конкретно то найти номер РабочейСтанции по номеру входящей в него железки . например видеокарты ..
...
Рейтинг: 0 / 0
WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
    #32920156
Фотография Alexandr Nikolaev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSСложно сказать, что Вы хотите доказать этим тестом. Загоните в дерево миллиончик записей с неплохим и разветвленным уровнем вложенности и тогда уже сравнивайте тесты циклов и рекурсивных запросов, вытаскивая от всего дерева до его участков.Полностью поддерживаю!!!
WITH RECURSIVE - полностью показывает свои преимущества, над самописными функциями/процедурами при больших объёмах.
Я утверждаю не голословно, так как поддерживаю БД, в которой листов примерно 40 млн., неговоря уже про остальные элементы древовидной структуры!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / WITH RECURSIVE Работает примерно в 20 раз медленнее чем цикл ..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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