powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / collection vs pipelined
4 сообщений из 4, страница 1 из 1
collection vs pipelined
    #39773550
cobalt_frog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,

переписываю старый чужой код..заметил, что функционал сделанный через конвейерные функции проигрывает намного, провел небольшой тест похожий на функционал. Требуется найти все четные числа от 1 до 2000000, заметил что через коллекции(find2) работает все намного быстрее чем через pipelined(find)
Код: plsql
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.
create or replace package body test is



  function tt1 return t_pipe_info pipelined
  is
  begin
    for i in (select  level 
                from  dual
             connect by level < 2000000)
    loop   
      pipe row (i);
    end loop;
  end;

  function tt2 return t_pipe_info pipelined
  is
  begin
    for i in (select * from table(tt1))
    loop   
      if mod(i.a,2) = 0 then
      pipe row (i);           
      end if;     
    end loop;
  end;

  function find return sys_refcursor
  is
    lcresult sys_refcursor;
  begin
    open lcresult for
    select * from table(tt2) order by 1 desc;
    return lcresult;
  end;

  function tt3 return t_pipe_info
  is
    tt  t_pipe_info;
  begin
    select  level 
            bulk collect into tt
      from  dual
    connect by level < 2000000;
    return tt;
  end;

  function tt4 return t_pipe_info
  is
    tt   t_pipe_info;
    tt1  t_pipe_info := t_pipe_info();
  begin
    tt1 := tt3;
    select  a 
            bulk collect into tt
      from  table(tt1) t
     where  mod(a,2) = 0;
    return tt;
  end;

  function find3 return sys_refcursor
  is
    lcresult      sys_refcursor;
    c_t_pipe_info t_pipe_info := t_pipe_info();
  begin
    c_t_pipe_info := tt4;
    open lcresult for
    select * from table(c_t_pipe_info) order by a desc;
   return lcresult;
  end;

end test;



Вроде считается, что на больших объемах данных конвейерные функции работают быстрее)) что не так?))
Есть у кого нить добытые опытным путем правила, для каких задач лучше использовать коллекции..а для каких pipeline?
...
Рейтинг: 0 / 0
collection vs pipelined
    #39773554
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frogзаметил что через коллекции(find2) работает все намного быстрее чем через pipelined(find)

Ну так order by-то совсем не бесплатный...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
collection vs pipelined
    #39773566
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog,

Замерь выполнение с помощью dbms_profiler, посмотри, сколько общего времени тратится, например, на
Код: plsql
1.
if mod(i.a,2) = 0
...
Рейтинг: 0 / 0
collection vs pipelined
    #39773568
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cobalt_frog,

Ты сравниваешь не pipelined, а for с bulk.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / collection vs pipelined
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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