Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по команде dbms_sql.parse / 9 сообщений из 9, страница 1 из 1
07.05.2003, 13:32
    #32155130
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
У меня есть несколько запросов которые я по очереди вызываю в
динамической сессии.
Если тот же запрос я отдам на компиляцию второй раз
будет ли он компилится так же как и в первый раз
или он разберется и не станет этого делать.

И вообще как сделать эту фичу чтобы таскать на выбор одним из нескольких запросов. Типы колонок совпадают. Поэтому жалко тратить время на парсинг и привязку выходных переменных.

Как нибудь можно один раз отпарсить каждый запрос и потом только выполнять их.
...
Рейтинг: 0 / 0
07.05.2003, 13:49
    #32155148
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
А оракл сам так и делает. Иначе нет смысла в наличии library cache. При первом попадании текста запроса на сервер происходит hard parse с полным разбором, проверкой прав и построением дерева выполнения. При последующих попаданиях того же текста (в 9 еще и похожего текста) происходит soft parse, то есть проверка доступа и все, дальше запрос сразу выполняется по существующему плану. Бывает ситуации, когда план инвалидируется (изменились определения объектов) или просто выбрасывается (не хватает места в пуле). Тогда при появлении использованного уже запроса вновь происходит построение дерева выполнения. Ораклу все равно, используете вы динамический sql или нет.

Этот вопрос очень странно услышать от сертифицированного оракловского администратора.
...
Рейтинг: 0 / 0
07.05.2003, 13:57
    #32155154
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
А вот неправда ваша.
Сколько не запускай коменду
dbms_sql.parse
dbms_sql.parse
она всегда выполняется примерно одно и тоже немаленькое время,
даже запускать их подряд

Есть же возможность принудительно перекомпилировать объект,
вероятно она так и поступает и плевать ей на libruary_cache

Вот отсюда и вопрос
нужно ли открывать N динамических сессий или можно поколдовать и
высасывать всё через одну.
...
Рейтинг: 0 / 0
07.05.2003, 14:08
    #32155164
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
Проверьте одинаковость текста запросов. Если он разный - используйте стандартную рекомендацию оракла использовать bind-переменные.
...
Рейтинг: 0 / 0
07.05.2003, 14:15
    #32155169
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
Вы что издеваетесь.
У меня запрос в переменной.
Код: plaintext
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.
      if NOT(dbms_sql.is_open(seq_curs_id)) then
         seq_curs_id:=dbms_sql.open_cursor;
      end if;
        vv_sql:= ' SELECT NVL(sa.dis_level,ts.dis_level) dis_level,ts.CON_LEVEL,disc_id,NVL(sa.CURR_ID,ts.curr_id) curr_id, ssh.subs_id, ssh.serv_id, ssh.trpl_id  ' || ' FROM   (select SH.SUBS_ID, SH.RLB_ID, SH.TRPL_ID, ssh.SERV_ID from SUBS_HISTORY SH, SUBS_SERV_HISTORY ssh '||' where SH.CLNT_ID = :CLNT_ID and sh.stime<= SYSDATE AND SYSDATE<sh.etime ' || ' AND sh.subs_id=ssh.subs_id  AND ssh.stime<= SYSDATE AND SYSDATE<ssh.etime ' || ' ) ssh, SUBS_AUTO sa,SERVICE s, ' || ' (SELECT ts.serv_id,ts.curr_id,ts.DIS_LEVEL,ts.con_level, ts.trpl_id, ts.rlb_id FROM TARIFF_SERVICE_LEVEL ts '||' WHERE ts.stime<= SYSDATE AND SYSDATE<ts.etime ) ts ' || ' WHERE  ssh.SERV_ID=sa.SERV_ID(+)  AND ssh.subs_id=sa.subs_id(+) ' || 'AND sa.stime<= SYSDATE AND SYSDATE<sa.etime ' || 'AND ssh.SERV_ID=ts.SERV_ID(+) ' || ' AND ssh.SERV_ID=s.serv_id AND ts.rlb_id=ssh.rlb_id AND ts.trpl_id=ssh.trpl_id ORDER BY dis_level DESC ' ;

 -- Время замеряется для разного количества строк здесь
 
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);
      dbms_sql.parse(seq_curs_id, vv_sql, dbms_sql.v7);

    	dbms_sql.bind_variable(seq_curs_id,':CLNT_ID',V_CLNT_ID);
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 1 ,V_DIS_LEVEL);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 2 ,V_CON_LEVEL);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 3 ,V_DISC_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 4 ,V_CURR_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 5 ,V_SUBS_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 6 ,V_SERV_ID);        
      	 dbms_sql.DEFINE_COLUMN(seq_curs_id, 7 ,V_TRPL_ID);      
      sql_result:=dbms_sql.execute(seq_curs_id);
      WHILE dbms_sql.fetch_rows(seq_curs_id)<> 0  
      LOOP
         ***
      END LOOP;      
      dbms_sql.close_cursor(seq_curs_id);

...
Рейтинг: 0 / 0
07.05.2003, 14:17
    #32155172
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
А использовать для разных запросов BIND_VARIABLE
я не могу там меняются ИМЕНА полей. :(
...
Рейтинг: 0 / 0
07.05.2003, 15:54
    #32155288
Lord-Ka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
Посмотрел в доке по dbms_sql.parse - явно конечно не сказано, но судя по приведенным там схемам обработки dbms_sql.parse парсит всегда заново. Твой пример это подтверждает.

Вот при EXECUTE IMMEDIATE не должно по идее парсить повторно.

Надо бы проверить, интересно будет.
...
Рейтинг: 0 / 0
07.05.2003, 18:46
    #32155495
Lazy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
Странно, как вы проверяли
Конечно soft parse, как и сказал Al.
При EXECUTE IMMEDIATE будет тоже самое. На сколько я понимаю dbms_sql нужен для того чтобы не делать soft parse.

cid:=dbms_sql.open_cursor;
wNUM2:=10000;
for wNUM in 1..10000 loop
vv_sql:= 'select field1 from test where field1='||wNUM2;
dbms_sql.parse(cid, vv_sql,dbms_sql.native);
end loop;
ret:=dbms_sql.execute(cid);
dbms_sql.close_cursor(cid);

cid:=dbms_sql.open_cursor;
wNUM2:=10000;
for wNUM in 1..10000 loop
vv_sql:= 'select field1 from test where field1='||wNUM;
dbms_sql.parse(cid, vv_sql,dbms_sql.native);
end loop;
ret:=dbms_sql.execute(cid);
dbms_sql.close_cursor(cid);

PL/SQL procedure successfully completed.
Elapsed: 00:00:03.25
PL/SQL procedure successfully completed.
Elapsed: 00:00:14.00
...
Рейтинг: 0 / 0
08.05.2003, 08:00
    #32155655
Oracle X-pert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по команде dbms_sql.parse
2 AL Ty prav,no dlya usloviya Execute immediate.
2 Eter:Tvoya zadacha toge reshaetsya dostatochno correct
( parallel parse v multisession mode, pri etom vremya zaprosa rastet -T
nelineino)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вопрос по команде dbms_sql.parse / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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