2010-11-26 5 views
10

J'ai cette requête qui retourne 7 lignes et prend 4ms dans la base de données mais 1075ms à instancier. Ce n'est qu'un exemple des temps et cela varie selon les objets, mais il ne semble pas logique que cela prenne autant de temps. Des conseils sur la façon d'augmenter la vitesse?La liste <int> prend beaucoup de temps à instancier avec 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>() 

requête SQL généré

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

Toute aide est appréciée. Merci

+0

Faut-il cette longue chaque fois qu'il est exécuté ou tout simplement la première fois? Quel générateur de code octet utilisez-vous? – jonnii

+0

@jonnii, Cela prend du temps à chaque fois. Le code d'octet est également NHibernate.ByteCode.Castle. – Gage

+0

@Gage ce qui se passe si vous le changez en renvoyant un IEnumerable au lieu de IEnumerable et utilisez List()? – jonnii

Répondre

5

Apparemment ce qui ralentissait était l'appel SetParameterList. Lorsque je formate le SQL avant d'obtenir quelque chose dans le sens de la base de données de 8 ms et de l'instanciation de 485 ms, ce qui est acceptable. J'aimerais avoir quelque chose de plus rapide mais ça ira pour le moment.

Voici le code que je suis actuellement en utilisant:

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

quelle version de NH utilisez-vous? – Jaguar

+0

@Jaguar, 2.1.2.4000 – Gage

+0

étrange. J'ai utilisé SetParameterList dans divers scénarios et types, je n'ai jamais vu un coup de perf. Les upstreamStations étaient-elles int [] ou quelque chose d'autre? – Jaguar

Questions connexes