2016-06-09 59 views
1

我在SSMS2008以下查詢:查詢速度在SQL Server Management Studio中(2008年)與NHibernate的session.Query

select * 
from Measurements 
where dt > '2016-01-01 04:00:00' 
    and dt < '2016-01-01 04:05:00' 
    and classification = 'heartbeat' 

我的表中有超過400萬條記錄在裏面,心跳等數據(我知道),但上面的查詢在不到1秒內執行(檢索1500條記錄)。 dt和分類列上有索引。

當我使用此查詢NHibernate的:

var heartbeats = session.Query<Measurements>() 
         .Where(m.dt > dtFr && 
           m.dt < dtTo && 
           m.classification = 'heartbeat') 
         .ToList(); 

。然而,此查詢失敗。唯一不同的是(據我所見),是我使用DateTime對象(和dtTo並將它們傳遞給linq表達式。但是,當這個查詢失敗(超時),我可以複製+粘貼失敗的查詢到SSMS2008,它會在那裏執行沒有任何問題。

編輯:昨天我做了太多的測試,我把事情弄混了。這似乎是失敗的查詢不會運行(均不是從SSMS)。我看不出我做錯了什麼。

+0

那麼現在的問題是什麼?當你不知道自己在做什麼時很難幫助你... –

回答

0

我可能會說,第一個選擇是在sql服務器上處理。 (很明顯,因爲您已經使用Management Studio進行了測試)

我認爲會發生什麼是代碼中的查詢請求來自sql server的所有數據,然後它會在您的本地應用程序中執行搜索。

我可能是錯的,因爲我不知道linq如何處理where子句,但它聽起來似乎可能是這種情況。

乾杯

托馬斯

1

有一個關於失蹤的映射信息,這在目前看來是最可疑的。即在情況下,有相關的參考資料,一些不規範的取(不懶,這是默認的,其實是最好的)

要解決(或者避免)這樣的問題,使用投影。這樣,NHibernate的將加載和後處理只是必填字段

var heartbeats = session.Query<Measurements>() 
    .Where(m.dt > dtFr && 
     m.dt < dtTo && 
     m.classification = 'heartbeat') 
    .Select(x => new {m.dt, m.classification }) 
    .ToList(); 

換句話說,原始SQL和最後的處理與NHibernate的區別...通常物化。可以肯定的是,你在這裏減少了...結果應該是一個直接的SQL執行速度很快

相關問題