참고 : 먼저 DBA Exchange에 게시하는 것이 고려되었지만 .NET 클라이언트 문제를 고려할 때 가장 먼저 여기에서 질문하는 것이 가장 좋습니다.ODP.NET의 첫 번째 쿼리는 항상 느립니다.
오라클 11g 개발 서버에 저장되어있는 ODP.NET (Oracle.DataAccess와 반대되는 Oracle.ManagedDataAccess 사용)이라는 두 가지 기능이 있습니다.
두 가지 기능은 SQL Developer에서 번개입니다 (의미가 있지만, 약 20,000 개의 레코드 만 선택하는 간단한 쿼리 임). 성능은 (System.Diagnostics.Stopwatch로 측정 한) 별이 C# 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
, 그것은 보인다.
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
그래서이 그것을 증명, 난 바로 그 첫 번째 쿼리 : 내 코드에서, 이제 살펴보기로하자 것을 호출, 이제
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;
: 이것을 증명하기 위해, 나는 바보 더미 기능을 만든 달리기는 항상 느립니다.
추가 정보 : 내가 말하는 모든 단일 기능에 대해 새 연결을 열고 닫습니다. 처음에는
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;
}
}
동일한 문제가 발생합니다. 수정 사항을 찾았습니까? 나는 [읽기] (http://stackoverflow.com/questions/34197079/net-oracle-managed-data-access-connection-pooling-not-working-or-slow) 데스크탑에서 네트워크 어댑터 및 가상화에 관한 내용 - 내 네트워크 사람이 나를 위해 설정을 변경하는 순간에 사용할 수 없습니다 ... –