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

Столкнулся с такой проблемой, что при выполнении одного и того же куска кода с разными биндам 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
soft parse: native dynamic sql vs dbms_sql
    #40082278
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем ты выполняешь каждый раз parse принудительно?
Вся фишка именно в том чтоб выполнить parse (да и bind, define) один раз, а затем только exec-fetch столько, сколько надо

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


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

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


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