2010-11-26 32 views
10

Tôi có truy vấn này trả về 7 hàng và mất 4ms trong cơ sở dữ liệu nhưng 1075ms để khởi tạo. Đó chỉ là một ví dụ về thời gian và nó thay đổi trên các đối tượng nhưng nó dường như không có ý nghĩa rằng phải mất quá lâu. Bất kỳ con trỏ về làm thế nào để tăng tốc độ?Danh sách <int> mất nhiều thời gian để nhanh chóng với Tiêu chí Nhibernate

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 tạo

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

Any help is appreciated. Cảm ơn

+0

Liệu nó thực hiện việc này từ lâu mỗi khi nó được chạy hay chỉ là lần đầu tiên? Bạn đang sử dụng trình tạo mã byte nào? – jonnii

+0

@jonnii, Phải mất một thời gian dài mỗi lần. Ngoài ra mã byte là NHibernate.ByteCode.Castle. – Gage

+0

@Gage những gì sẽ xảy ra nếu bạn thay đổi nó để trả về một IEnumerable thay vì IEnumerable và sử dụng List()? – jonnii

Trả lời

5

Rõ ràng những gì đã làm chậm nó xuống là cuộc gọi SetParameterList. Khi tôi định dạng SQL trước khi tôi nhận được một cái gì đó dọc theo dòng của cơ sở dữ liệu 8ms và instantms 485ms, đó là chấp nhận được. Tôi muốn có một cái gì đó nhanh hơn nhưng điều đó sẽ làm ngay bây giờ.

Dưới đây là đoạn code Tôi hiện đang sử dụng:

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

bạn đang sử dụng phiên bản NH nào? – Jaguar

+0

@Jaguar, 2.1.2.4000 – Gage

+0

lạ. Tôi đã sử dụng SetParameterList trong các kịch bản và loại khác nhau, tôi chưa bao giờ thấy một hit hoàn hảo. Là upstreamStations một int [] hay cái gì khác? – Jaguar

Các vấn đề liên quan