【发布时间】:2011-09-06 05:30:34
【问题描述】:
我注意到 parse_calls 等于我们的 Oracle 11g 数据库中的执行次数。
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语句? -
是的。一切都编译好了。没有
EXECUTE IMMEDIATE声明。 -
这可能与共享池设置有关,但我不记得如何检查。我相信这很快就会得到答复
-
我会问 - 你能证实这是一个主要的性能缺陷吗?如堆栈样本所示,它是否超过挂钟时间的 10%?如果是 10%,那么即使你可以完全消除它,整体时间也只会减少 10%。
-
我想是这样,但我总是鼓励人们以相对而非绝对的方式思考。不是因为这 10% 很小,而是因为问题的大小范围很广,你能看到的一个小问题可以将你的注意力从一个不太明显的大问题上转移开。然后,如果你能找到并修复大的那个,那么小那个现在会变得更大,按百分比计算,因为分母更小了。因此,如果您的解析成本为 10%,并且如果您还没有发现更大的问题,那么该代码非常接近最优,所以一定要追求 10%。
标签: c# sql performance oracle oracle11g