2014-11-26 3 views
2

У меня есть сценарий SQL, который выглядит следующим образом:У меня есть сценарий SQL

Variable nb number; 
Variable var1 varchar2(30); 
Variable var2 varchar2(30); 
EXEC :var1 := '&1'; 
EXEC :var2 := '&2'; 

BEGIN 
    SELECT count(*) into :nb FROM some_table where col1=:var1 and col2=:var2; 
END; 
/
print :nb; 
exit :nb; 

Этот скрипт выполняется несколько раз, используя такие команды, как:

sqlplus @myscript.sql LITERAL_A1 LITERAL_B1 
sqlplus @myscript.sql LITERAL_A2 LITERAL_B2 
sqlplus @myscript.sql LITERAL_A3 LITERAL_B3 
sqlplus @myscript.sql LITERAL_A4 LITERAL_B4 

Теперь мой вопрос связан с общим доступ в бассейн.

Когда я запускаю запрос:

select executions,sql_text 
from v$sqlarea 
where (sql_text like '%var1%' or sql_text like '%var2%') 

я получаю выход, как:

BEGIN SELECT count(*) into :nb1 FROM some_table where col1=:var1 and col2=:var2; END; [ Execution=4] 
BEGIN :var1 := 'LITERAL_A1' ; END;[ Execution=1] 
BEGIN :var2 := 'LITERAL_B1'; END; [ Execution=1] 
BEGIN :var1 := 'LITERAL_A2' ; END;[ Execution=1] 
BEGIN :var2 := 'LITERAL_B2'; END; [ Execution=1] 
BEGIN :var1 := 'LITERAL_A3' ; END;[ Execution=1] 
BEGIN :var2 := 'LITERAL_B3'; END; [ Execution=1] 
BEGIN :var1 := 'LITERAL_A4' ; END;[ Execution=1] 
BEGIN :var2 := 'LITERAL_B4'; END; [ Execution=1] 

Это показывает, что утверждение о главном запросе выборки удаляется, но инициализация переменных связывания была добавлена ​​раздор. Есть ли способ удалить это?

+1

В вашем скрипте не отображается «утверждение о переменных привязки». Он просто показывает, что SQL Oracle хранится в общем пуле. Вы видите соответствующие события ожидания? Плюс: это должно быть лучше спрошено на dba.stackoverflow –

+0

Если вы говорите о конкуренции, значит, вы беспокоитесь о производительности. Вы действительно видите проблемы с производительностью? –

+0

Нет моей главной заботы - делать инструкции типа BEGIN: var1: = 'LITERAL_A1'; END имеют какое-либо отношение к кешу библиотеки. Эти синтаксические анализаторы и блокировки берутся за кеш библиотеки. На самом деле я не очень уверен в различии между v $ sqlarea и кешем библиотеки. Каждый запрос, упомянутый в v $ sqlarea с исполнением = 1, влияет на производительность кэша библиотеки? – Rohit

ответ

4

«инициализация переменных связывания была добавлена ​​раздор»

Разногласия не означает, как вы используете его здесь. Нет никаких споров, нет конкуренции за ресурсы.

Скорее, у вас есть число похожие заявления. Они похожи, потому что SQL * Plus имеет переменные замещения; они не являются связующими переменными и не разрешают жестко закодированные значения. Следовательно, каждое исполнение отличается, и поэтому в кэше используется другой оператор.

Все это вполне ожидаемое поведение. Если вы думаете, что у вас есть настоящая проблема, вы, вероятно, ошибаетесь. Oracle устареет из этих заявлений с одним выстрелом, поэтому вряд ли они будут препятствовать кешированию более часто используемых запросов.

Если вы действительно хотите, чтобы они ушли, прекратите использование сценариев SQL * Plus и перейдите к хранимым процедурам.

+0

Я предполагаю, что v $ sqlarea показывает запросы, хранящиеся в кеше библиотеки. Если это правда, чем добавление таких начинаний, как BEGIN: var1: = 'LITERAL_A1'; КОНЕЦ; к нему каждый раз требовались блокировки. Я прав? или кеш библиотеки отличается от v $ sqlarea, а оператор, такой как присвоения переменных привязки, не имеет записей в кеше? – Rohit