当我从ODP.NET运行查询时,我在V $ SQL中看到,对于每次调用它都会执行PARSE_CALL。 参见:
select
s.FETCHES,s.PARSE_CALLS,s.sql_Text,s.sql_id
from v$sql s where
sql_Text = 'select 1 from dual /*test2*/'
返回:
即使我重复使用相同的OracleCommand并称为Prepare。
这是我的.NET代码:
using (var c = connection.CreateCommand())
{
c.CommandText = "select 1 from dual /*test2*/";
c.Prepare();
for (int i = 0; i < 9000; i++)
{
using (var r = c.ExecuteReader())
{
r.Read();
}
}
}
如何减少Parse_Calls的数量? 有没有办法让我让Oracle为所有这些重复执行保留服务器端游标,并在我处理命令时处理它?</ p>
我使用的是Oracle.ManagedDataAccess.dll版本4.122.1.20170624
答案 0 :(得分:0)
您的数据库可能有问题,请查看参数CURSOR_SHARING
当我尝试你的代码时,SQL_TEXT自动更改为'in original VBA code:
Dim dict As Scripting.Dictionary
Set dict = New Scripting.Dictionary
'To have this work in .CATScript, replace the code above with:
Dim dict
Set dict = CreateObject _
("Scripting.Dictionary")
我也使用了Oracle.ManagedDataAccess 4.122.1.0
select :"SYS_B_0" from dual /*test2*/
答案 1 :(得分:0)
经过多次调查后,我发现我想要的解决方案并不完全存在 - 这意味着我们无法在游标被清除时保持打开和控制。
我可以通过让.NET保持最后X个查询的游标保持打开来提高性能 - 导致&#34; PARSE_CALLS&#34;资讯
我是通过激活Oracles连接语句缓存来实现的。
在我的连接字符串中添加了以下内容: 语句缓存大小= 50;
这意味着Oracle.ODP会将最后50个select语句保留在缓存中,而不会再打开它们。
这对我的场景非常有用。我希望它可以帮助任何人