使用Oracle ODP.NET(或重用游标)减少PARSE_CALLS

时间:2018-01-15 14:20:21

标签: c# .net oracle odp.net odp.net-managed

当我从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*/'

返回:

Results from v$SQL

即使我重复使用相同的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

2 个答案:

答案 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语句保留在缓存中,而不会再打开它们。

这对我的场景非常有用。我希望它可以帮助任何人