Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / soft parse: native dynamic sql vs dbms_sql / 5 сообщений из 5, страница 1 из 1
07.07.2021, 10:11
    #40082274
mlc
mlc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soft parse: native dynamic sql vs dbms_sql
Всем привет.

Столкнулся с такой проблемой, что при выполнении одного и того же куска кода с разными биндам NDS оптимизирует работу, не выполняя даже soft parse в больших количествах, в то время как dbms_sql его выполняет.
Тест кейс:
ddl
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
create or replace package dropme_pkg is
    procedure prc(p_param_name varchar2,
                  p_logging boolean,
                  p_result_body out nocopy clob,
                  perrmsg out varchar2,
                  perrcode out number);
end;
/
create or replace package body dropme_pkg is
    procedure prc(p_param_name varchar2,
                  p_logging boolean,
                  p_result_body out nocopy clob,
                  perrmsg out varchar2,
                  perrcode out number)
   is
   begin
    dbms_lock.sleep(0.000001);
    p_result_body := 'string'; 
   end;
end;

NDS
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
    l_sql varchar2(255) := q'[
        begin
            dropme_pkg.prc(p_param_name => :1,
                          p_logging => :2,
                          p_result_body => :3,
                          perrmsg => :4,
                          perrcode => :5);
        end;
    ]';
    perrmsg varchar2(255);
    perrcode number;
    p_result_body clob;
begin
    for i in 1.. 1000
    loop
        execute immediate l_sql using in to_char(i), in true, out p_result_body, out perrmsg, out perrcode;
    end loop;
end;
/

dbms_sql
Код: 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.
declare
    l_sql varchar2(255) := q'[
        begin
            dropme_pkg.prc(p_param_name => :1,
                          p_logging => :2,
                          p_result_body => :3,
                          perrmsg => :4,
                          perrcode => :5);
        end;
    ]';
    perrmsg varchar2(255);
    perrcode number;
    p_result_body clob;
    l_sql_id pls_integer;
    l_rowcount integer;
begin
    for i in 1001.. 2000
    loop    
        l_sql_id := dbms_sql.open_cursor;
        dbms_sql.parse(l_sql_id, l_sql, dbms_sql.native);
        
        dbms_sql.bind_variable(l_sql_id, ':1', to_char(i));
        dbms_sql.bind_variable(l_sql_id, ':2', true);
        dbms_sql.bind_variable(l_sql_id, ':3', p_result_body);
        dbms_sql.bind_variable(l_sql_id, ':4', perrmsg);
        dbms_sql.bind_variable(l_sql_id, ':5', perrcode);
    
        l_rowcount := dbms_sql.execute(l_sql_id);
        
        dbms_sql.variable_value(l_sql_id, ':3', p_result_body);
        dbms_sql.variable_value(l_sql_id, ':4', perrmsg);
        dbms_sql.variable_value(l_sql_id, ':5', perrcode);
        
        dbms_sql.close_cursor(l_sql_id);
    end loop;
end;
/


А теперь результаты выполнения по запросу ниже до и после выполнения + разница значений:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
select ss.sid, ss.statistic#, st.name, ss.value 
from v$sesstat ss, v$statname st
where ss.statistic# = st.statistic# 
    and sid = userenv('sid') 
    and st.name in ('CPU used by this session', 'parse time cpu',
                    'parse time elapsed', 'parse count (total)' ,'parse count (hard)',
                    'session cursor cache hits', 'session cursor cache count')
order by st.name;


Статистика выполнения:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                            Native Dynamic SQL           dbms_sql
                            
Statistic name              Before After  Diff     Before After  Diff
--------------------------- ------ ------ ----     ------ ------ ----
CPU used by this session    109    120    11    |  121    144    23
parse count (hard)	    21     23     2     |  23     28     5
parse count (total)         1142   1145   3     |  1146   2150   1004
parse time cpu              21     22     1     |  22     23     1
parse time elapsed          120    120    0     |  120    148    28
session cursor cache count  26     0      0     |  0      4      4
session cursor cache hits   2111   3110   999   |  3110   4108   998


Насколько я знаю parse count(total) = soft parse + hard parse. Соответственно hard мы знаем и он не сильно между NDS и dbms_sql отличается, а вот soft значительно.

Подскажите, плиз, можно ли избавиться от soft parse в рамках использования dbms_sql и если нет, то почему тогда NDS не делает soft?
...
Рейтинг: 0 / 0
07.07.2021, 10:24
    #40082278
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soft parse: native dynamic sql vs dbms_sql
А зачем ты выполняешь каждый раз parse принудительно?
Вся фишка именно в том чтоб выполнить parse (да и bind, define) один раз, а затем только exec-fetch столько, сколько надо

https://docs.oracle.com/database/121/ARPLS/d_sql.htm#BABDJEBE
...
Рейтинг: 0 / 0
07.07.2021, 10:28
    #40082281
Sah
Sah
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soft parse: native dynamic sql vs dbms_sql
А зачем
Код: plsql
1.
2.
        l_sql_id := dbms_sql.open_cursor;
        dbms_sql.parse(l_sql_id, l_sql, dbms_sql.native);


внутри цикла делаешь? Это же разовая операция, выноси и смотри что получится.
...
Рейтинг: 0 / 0
07.07.2021, 10:59
    #40082290
mlc
mlc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soft parse: native dynamic sql vs dbms_sql
Sah,

Внутри цикла делаю так, как предполагается, что полный набор операторов, включая parse, должен выполняться из разных сессий. Цикл был добавлен для симуляции частоты выполнения.
Выполнение NDS в цикле не прибавило количество parse.
...
Рейтинг: 0 / 0
07.07.2021, 13:15
    #40082327
oragraf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
soft parse: native dynamic sql vs dbms_sql
mlc
Внутри цикла делаю так, как предполагается, что полный набор операторов, включая parse, должен выполняться из разных сессий.
Добавь еще в цикл установку самого оракла. Из разных сессий.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / soft parse: native dynamic sql vs dbms_sql / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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