powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Зафетчить курсор переданный функцией параллельно с первого раза
4 сообщений из 4, страница 1 из 1
Зафетчить курсор переданный функцией параллельно с первого раза
    #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
Зафетчить курсор переданный функцией параллельно с первого раза
    #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
Зафетчить курсор переданный функцией параллельно с первого раза
    #39613788
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

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

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


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