Oracle 我有一个SQL脚本

Oracle 我有一个SQL脚本,oracle,performance,plsql,database-tuning,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; exi

我有一个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]
这表明主select查询上的争用已删除,但绑定变量的初始化已添加到争用中。有没有办法去掉这个

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

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

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

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


如果您确实想让它们消失,请停止使用SQL*Plus脚本,转而使用存储过程。

您的脚本不会显示任何“绑定变量争用”。它仅显示Oracle在共享池中保留的SQL。您是否看到相应的等待事件?另外:如果您谈论的是争用,这意味着您担心性能,那么最好在dba.stackoverflow上问这个问题。你真的看到了性能问题吗?没有,我主要关心的是-do语句,比如BEGIN:var1:='LITERAL_A1';结束与库缓存有任何关系。是否对这些进行了分析,并在库缓存上为这些进行了锁定。实际上,我不太确定v$sqlarea和库缓存之间的区别。执行=1的v$sqlarea中提到的每个查询是否都会影响库缓存性能?我假设v$sqlarea显示了存储在库缓存中的查询。如果这是真的,那么就添加像BEGIN:var1:='LITERAL_A1'这样的开始项;结束;每次打开它都需要锁。我说得对吗?或者库缓存不同于v$sqlarea,并且类似于绑定变量赋值的语句在缓存中没有条目?