2010-11-26 10 views
10

Tengo esta consulta que devuelve 7 filas y tarda 4ms en la base de datos pero 1075ms para crear instancias. Ese es solo un ejemplo de los tiempos y varía según los objetos, pero no parece tener sentido que lleve tanto tiempo. ¿Alguna sugerencia sobre cómo aumentar la velocidad?Lista <int> tarda mucho tiempo en crear instancias con Nhibernate Criteria

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>() 

SQL consulta generada

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 */) 

Cualquier ayuda es apreciada. Gracias

+0

¿Considera este tiempo cada vez que se ejecute o sólo la primera vez? ¿Qué generador de código de bytes estás usando? – jonnii

+0

@jonnii, lleva mucho tiempo todo el tiempo. También el código de bytes es NHibernate.ByteCode.Castle. – Gage

+0

@Gage ¿Qué sucede si lo cambia para devolver un IEnumerable en lugar de IEnumerable y usa List()? – jonnii

Respuesta

5

Aparentemente, lo que estaba desacelerando era la llamada SetParameterList. Cuando formateo el SQL antes de obtener algo a lo largo de las líneas de la base de datos de 8 ms y la instanciación de 485 ms, lo cual es aceptable. Me gustaría tener algo más rápido pero eso servirá por ahora.

Aquí está el código que estoy utilizando actualmente:

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

que versión de NH estás usando? – Jaguar

+0

@Jaguar, 2.1.2.4000 – Gage

+0

extraño. He usado SetParameterList en varios escenarios y tipos, nunca he visto un golpe de perf. ¿Fue upstreamStations un int [] o algo más? – Jaguar

Cuestiones relacionadas