参数化的Oracle Command具有较慢的性能

时间:2017-09-11 15:25:37

标签: c# sql .net oracle ado.net

我们使用Oracle.ManagedDataAccess v12.1.24160719提供程序在Oracle上运行.Net应用程序。它适用于系统上的大多数查询,但是,特定的查询有点慢。

对于示例,当查询在OracleCommand上执行而没有任何OracleParameter或在查询上直接使用参数(字符串已编码)时,它执行得很好而且快速。如果我们在PL / SQL Oracle编辑器上遇到相同的查询,它也会执行得很好而且速度很快。它需要不到2秒钟。

但是,当我们传递参数的oracle参数时,它需要一个缓慢的性能,比如15秒。我们在查询中有22个参数。如果我们激活BbindByName的属性OracleCommand,则无效。

这是一个通用代码,它使用DbProviderFactory执行客户查询以从其数据库中提取数据。代码有效,但执行ExecuteReader时速度很慢。

var factory = DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client");

using (var con = factory.CreateConnection())
{
    con.ConnectionString = connectionString.Value;
    con.Open();

    using (var command = con.CreateCommand())
    {
        command.CommandText = sql;
        command.CommandType = CommandType.Text;
        command.Connection = con;

        // the parameters collection comes from outside of this scope
        foreach (var p in parameters)
        {
            var param = command.CreateParameter();

            param.ParameterName = p.Name;

            // because this method is just a test, we do not have values,
            // so, we pass DBNull.Value to arguments because it should just test the query sintaxe and check if it works.
            param.Value = DBNull.Value;

            command.Parameters.Add(param);
        }       

        // on ExecuteReader we get the slow performance
        using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
        {
            // hydrated some data structure here ...
        }
    }
}

有没有办法知道这个问题的性能问题是什么?

0 个答案:

没有答案