gpt4 book ai didi

c# - 使用 ODP.NET 的第一次查询总是很慢

转载 作者:太空狗 更新时间:2023-10-29 19:46:58 26 4
gpt4 key购买 nike

注意:我考虑先在 DBA Exchange 上发布这个,但考虑到这是一个 .NET 客户端问题,我认为最好先在这里提问。

我有两个函数存储在我的 Oracle 11g 开发服务器中,它们使用 ODP.NET 调用(使用 Oracle.ManagedDataAccess 而不是 Oracle.DataAccess)。

这两个函数在 SQL Developer 中快如闪电(这是有道理的,它们是仅在约 20,000 条记录上进行选择的简单查询),但从我的 C# 应用程序中触发时,性能(使用 System.Diagnostics.Stopwatch 测量)并不出色使用 ODP.Net。

结果如下:(忽略'转换时间和合成时间,它们不属于查询过程的一部分)

Connecting time - GET_TVM_ALL: 00:00:00.0553501
Query time - GET_TVM_ALL: 00:00:05.3467058
Conversion time: 00:00:07.6508273
Connecting time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0006773
Query time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0256008
Conversion time: 00:00:03.7280097
Composing time: 00:00:00.0157274
Total Elapsed: 00:00:16.7796351

GET_TVM_ALL 的 5 秒执行时间高得离谱。更令人惊讶的是,第二个查询要快得多。这很奇怪,因为毫无疑问,这是一个更复杂的查询,记录量超过 20 倍。

所以我把它们调换了一下,结果是这样的:

Connecting time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0573807
Query time - GET_TVM_STATUS_ALL_FUNC: 00:00:05.2981962
Conversion time: 00:00:03.6474905
Connecting time - GET_TVM_ALL: 00:00:00.0007322
Query time - GET_TVM_ALL: 00:00:00.0070785
Conversion time: 00:00:07.2473809
Composing time: 00:00:00.0154049
Total Elapsed: 00:00:16.2268687

如您所见,无论其内容如何,​​第一个查询似乎总是很慢。为了证明这一点,我做了一个愚蠢的虚拟函数:

CREATE OR REPLACE FUNCTION GET_DUMMY
RETURN SYS_REFCURSOR
AS
-- REFCURSOR to return data
pCursor SYS_REFCURSOR;
BEGIN
OPEN pCursor FOR SELECT 1 FROM DUAL;
RETURN pCursor;
END;

现在,从我的代码中调用它,让我们看看:

Connecting time - GET_DUMMY: 00:00:00.0581149
Query time - GET_DUMMY: 00:00:05.4103165
Conversion time: 00:00:00.0005617
Connecting time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0006580
Query time - GET_TVM_STATUS_ALL_FUNC: 00:00:00.0759243
Conversion time: 00:00:03.7577602
Connecting time - GET_TVM_ALL: 00:00:00.0000489
Query time - GET_TVM_ALL: 00:00:00.0037654
Conversion time: 00:00:07.5071360
Composing time: 00:00:00.0152159
Total Elapsed: 00:00:16.7819147

这证明了这一点,我运行的第一个查询总是很慢。

额外信息:我正在为我调用的每个函数打开和关闭一个新连接。

顺便说一句,这是我的辅助函数:

public static List<T> ExecuteFunction<T>(string strConnection, string strFunction, OracleDbType returnType, List<DataOracleParameter> parameterList) where T : new()
{
Stopwatch watch = new Stopwatch();

using (OracleConnection objConnection = new OracleConnection(strConnection))
{

// Create the command object and set attributes
OracleCommand objCommand = new OracleCommand(strFunction, objConnection);
objCommand.CommandType = CommandType.StoredProcedure;

// Set the return parameter and type
OracleParameter returnValue = new OracleParameter();
returnValue.OracleDbType = returnType;
returnValue.Direction = ParameterDirection.ReturnValue;
objCommand.Parameters.Add(returnValue);

// Set additional parameters
if (parameterList != null && parameterList.Count > 0)
{
foreach (DataOracleParameter parameter in parameterList)
{
OracleParameter inputValue = new OracleParameter();
inputValue.ParameterName = parameter.ParameterName;
inputValue.OracleDbType = parameter.ParameterType;
inputValue.Value = parameter.ParameterValue;
inputValue.Direction = ParameterDirection.Input;
objCommand.Parameters.Add(inputValue);
}
}

// Create a data adapter to use with the data set
OracleDataAdapter dataAdapter = new OracleDataAdapter(objCommand);

// Create and fill the dataset
DataSet dataSet = new DataSet();

watch.Start();
dataAdapter.Fill(dataSet);
watch.Stop();
Console.WriteLine("Query time - {0}: {1}", strFunction, watch.Elapsed);

List<T> valueList = dataSet.Tables[0].ToList<T>();

return valueList;
}
}

最佳答案

一开始我建议你调整FetchSize在 OracleCommand 对象上。

关于c# - 使用 ODP.NET 的第一次查询总是很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com