2014-09-06 3 views
5

참고 : 먼저 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; 
    } 
} 
+0

동일한 문제가 발생합니다. 수정 사항을 찾았습니까? 나는 [읽기] (http://stackoverflow.com/questions/34197079/net-oracle-managed-data-access-connection-pooling-not-working-or-slow) 데스크탑에서 네트워크 어댑터 및 가상화에 관한 내용 - 내 네트워크 사람이 나를 위해 설정을 변경하는 순간에 사용할 수 없습니다 ... –

답변

1

내가 OracleCommand를 개체의 조정 FetchSize 당신을 건의 할 것입니다 :

여기 그런데 내 도우미 함수입니다.

+0

FetchSize에 대한 몇 가지 유사 콘텐츠를 시도 (1-1024에서가는),하지만 그 차이를 많이하지 않았다. 너무 작은 FetchSize가 SELECT 1 FROM DUAL에 어떻게 영향을 줄 수 있는지 이해하지 못할 것입니다. –

관련 문제