2010-11-26 6 views
10

Ich habe diese Abfrage, die 7 Zeilen zurückgibt und 4ms in der Datenbank aber 1075ms zu instanziieren. Das ist nur ein Beispiel der Zeit und es variiert auf den Objekten, aber es scheint nicht sinnvoll, dass es so lange dauert. Irgendwelche Hinweise, wie man die Geschwindigkeit erhöht?Liste <int> dauert lange instanziieren mit Nhibernate Kriterien

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 Query erzeugt

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

Jede Hilfe sehr geschätzt wird. Danke

+0

Dauert es dieses lange jedes Mal, es oder einfach nur das erste Mal ausgeführt wird? Welchen Byte-Code-Generator verwendest du? – jonnii

+0

@jonnii, Es dauert jedes Mal sehr lange. Der Byte-Code ist auch NHibernate.ByteCode.Castle. – Gage

+0

@Gage was passiert, wenn Sie es ändern, um ein IEnumerable anstelle von IEnumerable zurückzugeben und List() verwenden? – jonnii

Antwort

5

Offenbar was verlangsamte es war der Aufruf SetParameterList. Wenn ich das SQL formatiere, bekomme ich etwas in Richtung 8ms Datenbank und 485ms Instantiierung, was akzeptabel ist. Ich hätte gerne etwas schneller, aber das reicht jetzt.

ist hier der Code verwende ich zur Zeit:

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

Welche Version von NH verwenden Sie? – Jaguar

+0

@ Jaguar, 2.1.2.4000 – Gage

+0

seltsam. Ich habe SetParameterList in verschiedenen Szenarien und Typen verwendet, ich habe noch nie einen Perf-Treffer gesehen. War die upstreamStations ein int [] oder etwas anderes? – Jaguar