Cha*_*a W 7 c# sql oracle performance oracle11g
我注意到parse_calls等于Oracle 11g数据库中的执行次数.
select parse_calls, executions
from v$sql order by parse_calls desc;
Run Code Online (Sandbox Code Playgroud)
运行上面的查询会得到以下结果.
"PARSE_CALLS" "EXECUTIONS"
87480 87480
87475 87476
87044 87044
26662 26662
21870 21870
21870 21870
Run Code Online (Sandbox Code Playgroud)
我知道这是一个主要的性能缺陷.所有这些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;
Run Code Online (Sandbox Code Playgroud)
结果如下
"NAME" "SUM(S1.VALUE)"
"parse count (describe)" 0
"parse count (failures)" 29
"parse count (hard)" 258
"parse count (total)" 11471
Run Code Online (Sandbox Code Playgroud)
因此,与解析数量相比,硬解析的数量似乎非常低.感谢大家的回复:)
最终更新:
解析的主要问题是因为我们在连接字符串中关闭了连接池.打开连接池后,我能够完全解决解析问题.
从这个开始:
SELECT name, SUM(value)
FROM v$sesstat s1 join v$statname s2 on s1.statistic# = s2.statistic#
WHERE s1.name LIKE '%parse count%'
GROUP BY name
ORDER BY 1,2;
Run Code Online (Sandbox Code Playgroud)
这将为您提供硬解析和总解析的数量。查询中的 parse_calls 值是总解析,包括硬解析和软解析。
你的 SQL 是做什么的?游标处理不多,大多是单个语句?您获得的执行与解析比率几乎为 1-1,如果它们是软解析,则意味着您没有进行太多游标处理。
编辑:
除非您可以修改代码以打开并挂起每个 SQL 语句的游标,并在会话中尽可能多地重用它们,否则我认为您无法避免解析。
| 归档时间: |
|
| 查看次数: |
3236 次 |
| 最近记录: |