2010-11-26 13 views
10

Ho questa query che restituisce 7 righe e richiede 4 ms nel database ma 1075ms per creare un'istanza. Questo è solo un esempio dei tempi e varia sugli oggetti, ma non sembra avere senso che ci voglia così tanto tempo. Qualche suggerimento su come aumentare la velocità?L'elenco <int> impiega molto tempo per creare un'istanza con criteri di inibizione

var criteria = 
       GetSession().CreateSQLQuery(
        @" 
        select circt_id as CircuitId from normal_upstream 
         where dni_equip_type = 'A' 

         start with up_equip_stn_no in (:UpStationNo1) 
         connect by prior equip_stn_no = up_equip_stn_no 
         union 
         select circt_id as CircuitId 
         from normal_upstream 
         where up_equip_stn_no in (:UpStationNo1)") 
        .AddScalar("CircuitId", NHibernateUtil.Int32).SetParameterList("UpStationNo1",upstreamStations) 
        .List<int>() 

query SQL generato

select 
    circt_id as CircuitId 
from normal_upstream 

where dni_equip_type = 'A' 

          start with up_equip_stn_no in (
    'B' /* :p0 */) 
         connect by prior equip_stn_no = up_equip_stn_no 
         union 
         select 
circt_id as CircuitId 
         from normal_upstream  
where up_equip_stn_no in (
    'B' /* :p1 */) 

Ogni aiuto è apprezzato. Grazie

+0

ci vuole questo lungo ogni volta che viene eseguito o solo la prima volta? Quale generatore di codice byte stai usando? – jonnii

+0

@jonnii, ci vuole molto tempo ogni volta. Anche il codice byte è NHibernate.ByteCode.Castle. – Gage

+0

@Gage cosa succede se lo si cambia per restituire un oggetto IEnumerable anziché IEnumerable e utilizzare List()? – jonnii

risposta

5

Apparentemente quello che stava rallentando era la chiamata SetParameterList. Quando formatto l'SQL prima di ottenere qualcosa sulla falsariga del database 8ms e dell'istanziazione 485ms, che è accettabile. Mi piacerebbe avere qualcosa di più veloce, ma per ora lo farò.

ecco il codice Attualmente sto usando:

var sql = 
      String.Format(
       @"select circt_id as CircuitId from normal_upstream 
       where dni_equip_type = 'FDR_OCR' 
         start with up_equip_stn_no in ({0}) 
         connect by prior equip_stn_no = up_equip_stn_no 
         union 
         select circt_id as CircuitId 
         from normal_upstream 
         where up_equip_stn_no in ({0})", 
       String.Join(",",upstreamStations.Select(x=>"'"+x+"'").ToArray())); 
     var criteria = 
      GetSession().CreateSQLQuery(sql) 
       .AddScalar("CircuitId", NHibernateUtil.Int32) 
       .List(); 
      return criteria; 
+0

quale versione di NH stai usando? – Jaguar

+0

@Jaguar, 2.1.2.4000 – Gage

+0

strano. ho usato SetParameterList in vari scenari e tipi, non ho mai visto un successo. L'upstreamStations era un int [] o qualcos'altro? – Jaguar

Problemi correlati