我有一个如下所示的 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]
这表明主选择查询上的争用被删除,但绑定变量的初始化被添加了争用。有什么办法可以消除这个吗?