Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Зафетчить курсор переданный функцией параллельно с первого раза  [new]
Valergrad
Member

Откуда:
Сообщений: 556
Обнаружил, что если фетчить sys_refcursor то почему-то при первом запуске он всегда выполняется не параллельно ( т.е. несмотря на параллельный план, выполняется в один поток ). Со второго раза нормально. В чем может быть дело?
Простой скрипт чтобы воспроизвести у себя ( oracle 11.2.0.4 ):

create table t1 ( x number, y varchar2(4000) );
create type t_number as table of number;

-- заполнить табличку
declare 
    i number;
begin
    for i in 1..5 loop
        insert into t1
            select i * 100000 + rownum , rpad(owner || object_name, 4000, ' ')  from dba_objects;
        commit;
    end loop;
end;    

-- при первом запуске (хард. парсе ) выполняется всегда сериально,  при последующих - параллельно.
declare
    v_res sys_refcursor;
    v_arr t_number := t_number();
    type t_arr is table of t1%rowtype;
    v_val t_arr := t_arr();
    
    procedure func_returning_cursor(p_ids in t_number,                                 
                                 p_ret out sys_refcursor) is
    begin
        open p_ret for select /*+ parallel(8) */ t.* from table(p_ids) p, t1 t where p.column_value = t.x;        
    end;     
                                         
begin
    v_arr.extend(1000000);
    for i in 1..1000000
    loop
        v_arr(i) := i;
    end loop;
    func_returning_cursor(v_arr, v_res);
    
    fetch v_res bulk collect into v_val;
    
end;
8 мар 18, 19:58    [21245232]     Ответить | Цитировать Сообщить модератору
 Re: Зафетчить курсор переданный функцией параллельно с первого раза  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5056
Valergrad,

Первое же выполнение происходит прараллельно и порождает два чайлда
select sql_id,
       executions,
       child_number
       --,rows_processed
  from v$sql
 where sql_text like '%parallel(8)%' and sql_text not like '%v$sql%' and sql_text not like '%declare%';

SQL_ID        EXECUTIONS CHILD_NUMBER
------------- ---------- ------------
dknw7mqyg5789          1            0
dknw7mqyg5789          0            1

2 rows selected.

select child_number, bind_mismatch
  from v$sql_shared_cursor
 where sql_id = 'dknw7mqyg5789';

CHILD_NUMBER BIND_MISMATCH
------------ -------------
           0 N            
           1 Y            

2 rows selected.

Сэмплы основной сессии трекаются под child 0, а сэмплы слейвов под child 1.
select distinct decode(session_id, qc_session_id, 'main', 'slave') sess_type, sql_child_number--, sql_exec_start
  from v$active_session_history
 where sql_id = 'dknw7mqyg5789';

SESS_TYPE SQL_CHILD_NUMBER
--------- ----------------
main                     0
slave                    1

2 rows selected.

Подробнее кто что делал покажет dbms_sqltune.report_sql_monitor.

PS. Независимо от параллельности чтение коллекции всегда будет в один поток.
8 мар 18, 21:25    [21245357]     Ответить | Цитировать Сообщить модератору
 Re: Зафетчить курсор переданный функцией параллельно с первого раза  [new]
Valergrad
Member

Откуда:
Сообщений: 556
dbms_photoshop,

вы совершенно правы, спасибо!
Т.е. ошибка получается в моем скрипте для анализа - признаюсь, я не ожидал что одно выполнение одного запроса может создать несколько курсоров. Это многое объясняет.
Справедливости ради, отметим что TOAD делает ту же самую ошибку и тоже показывает это как-то странно.
12 мар 18, 21:29    [21251172]     Ответить | Цитировать Сообщить модератору
 Re: Зафетчить курсор переданный функцией параллельно с первого раза  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5056
Valergrad,

Слишком уж много кривостей у Оракла при работе с коллекциями в параллельных запросах.
При этом, бывает совсем не очевидно когда оно очередной раз выстрелит, например, member condition + parallel.
Если интересует полноценная параллельная обработка - используйте лучше временные таблицы вместо коллекций.
13 мар 18, 16:11    [21253129]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить