1

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

回报:

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 为所有这些重复执行保留服务器端光标,并在我处理命令时处理它?

我正在使用 Oracle.ManagedDataAccess.dll 版本 4.122.1.20170624

4

2 回答 2

0

可能是您的数据库有问题,请查看参数CURSOR_SHARING

当我尝试您的代码时,SQL_TEXT 会自动更改为select :"SYS_B_0" from dual /*test2*/I also used Oracle.ManagedDataAccess 4.122.1.0

SELECT s.FETCHES,s.PARSE_CALLS,s.sql_Text,s.sql_id, executions
FROM v$SQL s 
WHERE sql_Text LIKE 'select :"SYS_B_0" from dual /*test2*/';

FETCHES PARSE_CALLS SQL_TEXT    SQL_ID  EXECUTIONS
18006   14  select :"SYS_B_0" from dual /*test2*/   bk52pdazabzff   18006
于 2018-01-15T16:34:13.433 回答
0

经过大量调查,我发现我想要的解决方案并不完全存在 - 这意味着我无法保持光标打开并控制它们何时被清除。

我可以通过要求 .NET 保持最后一个 X 查询的游标打开来提高性能 - 导致“PARSE_CALLS”信息显着减少。

我通过激活 Oracle 连接语句缓存来做到这一点。

在我的连接字符串中添加了以下内容:Statement Cache Size=50;

这意味着 Oracle.ODP 会将最后 50 条选择语句保留在缓存中,使它们的游标保持打开状态并且不再对其进行解析。

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

于 2018-05-30T08:48:59.503 回答