2012-05-23 55 views
-1
int pageSize = 36; 
int pageIndex=1; 

IMultiQuery multiQuery = _session.CreateMultiQuery(); 
      multiQuery 
       .Add(session.CreateQuery("select * from Smart_Products where " + where + " order by " + orderBy) 
        .SetFirstResult((pageIndex - 1) * pageSize) 
        .SetMaxResults(pageSize)) 
       .Add(session.CreateQuery("select count(*) c from Smart_Products where " + where)) 
       .SetInt32("BrandId", brandId) 
       .SetInt32("Flag", flag) 
       .SetInt32("Status", 1); 
      if (categoryId > 0) 
      { 
       multiQuery.SetInt32("CategoryId", categoryId); 
      } 
      IList results = multiQuery.List(); 
      foreach (var o in (IList)results[0]) 
       products.Add((ProductInfo)o); 
      long count = (long)((IList)results[1])[0]; 

同樣的查詢當它分頁大數據時(ex.all行數1000000行)得到結果快,但是小數據(例如所有行數5行)慢。nhibernate返回結果大小導致性能差異爲什麼?

但我使用sql profiler來跟蹤查詢,並複製查詢執行它在msms它獲得數據非常快速使用50ms,但使用nhibernate列出數據時,小數據成本10s甚至計時,我已經嘗試一些方法,在網站發佈,清除緩存並使用無狀態會話都沒有得到單詞。任何人都可以知道如何改善它。謝謝。

+0

當您獲得所有行時,您使用的代碼是什麼? – Baz1nga

回答

1

首先,你打開SQL注入,你不應該在構建SQL語句時真的使用字符串連接。這將在未來回來並咬你。請抽出時間查看這篇文章SQL Injection並改用參數化查詢。

現在對於你的問題,有些事情要考慮: -

  1. 是WHERE子句同樣爲每一個測試?
  2. 索引是問題的原因嗎?
  3. 你看過SSMS中的查詢計劃,看看發生了什麼?
  4. 當您第二次運行相同的SQL兩次時,它將被緩存在SQL Server上,這就是爲什麼您第二次看到更快的時間。

作爲註腳它不是NHibernate的引起的問題它是SQL Server和正在運行的查詢。我建議你先看看這個。

+0

是的,我發現問題使用sql profiler,當數據acount不同的情況下執行計劃不同。 – liurongwei

相關問題