2014-09-06 13 views
5

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ş gibi

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 

, ö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; 
    } 
} 
+0

- 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 ... –

cevap

1

Ben OracleCommand nesne üzerinde ayarlamak FetchSize sizi öneririm:

İşte bu arada benim yardımcı fonksiyon.

Ben aynı sorunları acı çekiyorum
+0

(1'den gidiş - 1024) FetchSize için varyasyon çift çalıştı, ama bu kadar fark yapmak değildi. FetchSize'in çok küçük olmasının SELECT 1 FROM DUAL'i nasıl etkileyebileceğini de anlayamıyorum. –