我注意到parse_calls等于我们的Oracle 11g数据库中的执行次数。在Oracle中减少分析调用
select parse_calls, executions
from v$sql order by parse_calls desc;
运行上述查询得出以下结果。
"PARSE_CALLS" "EXECUTIONS"
87480 87480
87475 87476
87044 87044
26662 26662
21870 21870
21870 21870
因为我知道这是一个主要的性能缺陷。所有这些SQL语句都是存储过程或使用绑定变量。我还重用了C#中调用存储过程的命令对象。
如何减少此解析呼叫的数量?
此外,有一些方法可以区分硬解析和软解析吗?
编辑:
正如@DCookie提到我跑了数据库以下查询。
SELECT s2.name, SUM(s1.value)
FROM v$sesstat s1 join v$statname s2 on s1.statistic# = s2.statistic#
WHERE s2.name LIKE '%parse count%'
GROUP BY s2.name
ORDER BY 1,2;
结果如下
"NAME" "SUM(S1.VALUE)"
"parse count (describe)" 0
"parse count (failures)" 29
"parse count (hard)" 258
"parse count (total)" 11471
所以似乎很难解析的数量相比,解析的数量是非常低的。感谢大家对他们的回答:)
最后更新:
用于解析的主要问题是因为我们有连接池的连接字符串中关闭。打开连接池后,我能够完全解决分析问题。
我假设,存储过程被编译并且不运行'EXECUTE IMMEDIATE'语句? – 2011-06-01 11:44:47
是的。一切都编译完成。没有'EXECUTE IMMEDIATE'语句。 – 2011-06-01 11:48:04
这很可能与共享池设置有关,但我不记得如何检查。我相信这将很快回答 – 2011-06-01 11:50:32