Oracle 我有一个SQL脚本
我有一个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
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,并且类似于绑定变量赋值的语句在缓存中没有条目?