2014-09-06 13 views
5

नोट: मैंने इसे पहले डीबीए एक्सचेंज पर पोस्ट करने पर विचार किया, लेकिन इस पर एक .NET क्लाइंट मुद्दा पर विचार किया, मैंने सोचा कि पहले यहां पूछना सबसे अच्छा था।ODP.NET के साथ पहली क्वेरी हमेशा धीमी है

मेरे पास दो कार्य हैं जो मेरे ओरेकल 11 जी विकास सर्वर में संग्रहीत हैं, जिन्हें ODP.NET का उपयोग करने के लिए कहा जाता है (Oracle.ManagedDataAccess का उपयोग Oracle.DataAccess के विपरीत)।

एसक्यूएल डेवलपर में दो फ़ंक्शन बिजली तेज हैं (जो समझ में आता है, वे केवल 20,000 रिकॉर्ड पर चुनने के लिए सरल प्रश्न हैं), लेकिन प्रदर्शन (System.Diagnostics.Stopwatch के साथ मापा गया) मेरे सी # से निकालकर तारकीय से कम था। ओडीपी.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 सेकंड का एक निष्पादन समय हास्यास्पद अधिक है। कभी और आश्चर्य की बात यह है कि दूसरी क्वेरी बहुत तेज है। यह अजीब बात है, क्योंकि इसमें संदेह नहीं है कि रिकॉर्ड की मात्रा 20x से अधिक पर एक जटिल सवाल है।

तो मैं उनके आसपास बंद है, और इस परिणाम है:

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; 
    } 
} 
+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 बहुत छोटा कैसे हो सकता है डुएल से 1 चुनें। –

संबंधित मुद्दे