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 に答える