Not: Ben ilk DBA Exchange bu gönderme, ama bu bir .NET istemci sorunu göz önünde bulundurarak kabul, ben buraya ilk sormak iyi olduğunu düşünüyorum.İlk sorgu daima yavaş
I (Oracle.DataAccess aksine Oracle.ManagedDataAccess kullanarak) ODP.NET kullanarak denir benim Oracle 11g geliştirme sunucusunda, saklanır iki işlevi vardır.
SQL Developer'taki iki işlev yıldırım hızlıdır (bu da mantıklıdır, yalnızca ~ 20.000 kayıtta basit sorgulardır), ancak performans (System.Diagnostics.Stopwatch ile ölçülür) C# birimimden ateşlendiğinde yıldızdan daha azdı ODP.Net kullanarak uygulama.
Burada sonuçları:
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 için 5 saniyelik bir uygulama süresi gülünç yüksektir (Dönüşüm zamanı ve süresi oluşturan' saymak, sorguyu sürecinin bir parçası değildir). Daha da şaşırtıcı olan şey, ikinci sorgulamanın çok daha hızlı olmasıdır. den fazla 20x kayıtlarının miktarı üzerinde daha karmaşık bir sorgu şüphesiz olduğu gibi bu garip.
Bu yüzden onları birbirlerinin yerine geçecek ve bu sonucudur: Gördüğünüz gibi ilk sorgu içeriği ne olursa olsun, her zaman yavaş gibiConnecting 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
, öyle görünüyor.
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
Yani bu bunu kanıtlıyor, ben ilk sorguyu: my kodundan, haydi bir bakalım öyle demeyi, Şimdi
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;
: Bunu kanıtlamak için, ben aptal bir kukla işlevi yapılan koşmak her zaman yavaş.
Ek bilgi: Aradığım her işlev için yeni bir bağlantı açıp kapıyorum. İlk başta
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;
}
}
- Hiç bir düzeltme buldunuz? Ben masaüstünde Ağ Adaptörü ve sanallaştırma hakkında (http://stackoverflow.com/questions/34197079/net-oracle-managed-data-access-connection-pooling-not-working-or-slow) bir şey [okuma] - benim Ağ adam bana ayarlarını değiştirmek için şu anda ulaşılamıyor ... –