Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Зафетчить курсор переданный функцией параллельно с первого раза / 4 сообщений из 4, страница 1 из 1
08.03.2018, 19:58
    #39612323
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зафетчить курсор переданный функцией параллельно с первого раза
Обнаружил, что если фетчить sys_refcursor то почему-то при первом запуске он всегда выполняется не параллельно ( т.е. несмотря на параллельный план, выполняется в один поток ). Со второго раза нормально. В чем может быть дело?
Простой скрипт чтобы воспроизвести у себя ( oracle 11.2.0.4 ):

Код: 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.
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;
...
Рейтинг: 0 / 0
08.03.2018, 21:25
    #39612339
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зафетчить курсор переданный функцией параллельно с первого раза
Valergrad,

Первое же выполнение происходит прараллельно и порождает два чайлда
Код: plsql
1.
2.
3.
4.
5.
6.
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%';


Код: plsql
1.
2.
3.
4.
5.
6.
SQL_ID        EXECUTIONS CHILD_NUMBER
------------- ---------- ------------
dknw7mqyg5789          1            0
dknw7mqyg5789          0            1

2 rows selected.


Код: plsql
1.
2.
3.
select child_number, bind_mismatch
  from v$sql_shared_cursor
 where sql_id = 'dknw7mqyg5789';


Код: plsql
1.
2.
3.
4.
5.
6.
CHILD_NUMBER BIND_MISMATCH
------------ -------------
           0 N            
           1 Y            

2 rows selected.


Сэмплы основной сессии трекаются под child 0, а сэмплы слейвов под child 1.
Код: plsql
1.
2.
3.
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';


Код: plsql
1.
2.
3.
4.
5.
6.
SESS_TYPE SQL_CHILD_NUMBER
--------- ----------------
main                     0
slave                    1

2 rows selected.


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

PS. Независимо от параллельности чтение коллекции всегда будет в один поток.
...
Рейтинг: 0 / 0
12.03.2018, 21:29
    #39613788
Valergrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зафетчить курсор переданный функцией параллельно с первого раза
dbms_photoshop,

вы совершенно правы, спасибо!
Т.е. ошибка получается в моем скрипте для анализа - признаюсь, я не ожидал что одно выполнение одного запроса может создать несколько курсоров. Это многое объясняет.
Справедливости ради, отметим что TOAD делает ту же самую ошибку и тоже показывает это как-то странно.
...
Рейтинг: 0 / 0
13.03.2018, 16:11
    #39614202
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зафетчить курсор переданный функцией параллельно с первого раза
Valergrad,

Слишком уж много кривостей у Оракла при работе с коллекциями в параллельных запросах.
При этом, бывает совсем не очевидно когда оно очередной раз выстрелит, например, member condition + parallel .
Если интересует полноценная параллельная обработка - используйте лучше временные таблицы вместо коллекций.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Зафетчить курсор переданный функцией параллельно с первого раза / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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