我们使用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 ...
}
}
}
有没有办法知道这个问题的性能问题是什么?