नोट: मैंने इसे पहले डीबीए एक्सचेंज पर पोस्ट करने पर विचार किया, लेकिन इस पर एक .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;
}
}
मुझे एक ही समस्या का सामना करना पड़ रहा है - क्या आपको कभी भी कोई फिक्स मिल गया? मैं [पढ़ा गया] (http://stackoverflow.com/questions/34197079/net-oracle-managed-data-access-connection-pooling-not-working-or-slow) डेस्कटॉप एडाप्टर और डेस्कटॉप पर वर्चुअलाइजेशन के बारे में कुछ - मेरे नेटवर्क लड़के को मेरे लिए सेटिंग्स बदलने के लिए इस समय अनुपलब्ध है ... –