我有一个SQL脚本

时间:2014-11-26 07:18:07

标签: oracle performance plsql database-tuning

我有一个如下所示的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 个答案:

答案 0 :(得分:4)

  

“绑定变量的初始化已添加争用”

争用并不意味着你如何在这里使用它。没有争用,也没有争夺资源。

相反,你拥有的是一些类似的语句。它们是相似的,因为SQL * Plus具有替换变量;这些不是绑定变量并解析为硬编码值。因此,每次执行都是不同的,因此缓存中的语句不同。

所有这些都是完全预期的行为。如果你认为你有一个真正的问题,你可能会弄错。 Oracle将使这些一次性语句老化,因此它们不太可能阻止更常用的查询的缓存。

如果你真的想让它们消失,请停止使用SQL * Plus脚本并转而使用存储过程。