2010-02-16 123 views
4

這是使用流利NHibernateNHibernate花費很長時間來運行查詢

我有一個NHibernate查找是從一個表中檢索數據。如果我採用生成的sql並通過查詢分析器運行,它需要~18ms運行。

使用NHProfiler,我得到這個查詢的持續時間〜1800毫秒 - 比sql長100倍!

Query duration 
- Database only:1800ms 
- Total: 1806ms 

正被填充的對象包含一個子類,但是這個孩子正在從NHibernate的第二級高速緩存

正在被返回的被尋呼的數據(50查詢)加載雖然作爲遠據我所知,這應該沒有什麼區別

我也有計數運行,並且再次,這是根據NHProfiler在查詢分析儀和約1800毫秒〜4ms。

NH Profiler是否顯示查詢執行時間或完成檢索時間,映射類並構造對象圖?如果它是前者 - 爲什麼它比直接運行查詢花費的時間更長?

編輯:剛剛發現這個帖子由Ayende關於NH探查給出的查詢持續時間值:http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx - 所以它肯定是花了很長時間的數據庫查詢

+0

ADO.NET需要多長時間? – 2010-02-16 13:41:27

+0

當你用像螞蟻或dottrace這樣的剖析器來剖析代碼時,主要的瓶頸是什麼? – Paco 2010-02-16 14:51:37

+0

使用ADO.NET只需要NHibernate的一小部分時間。 我目前還沒有安裝任何性能分析軟件,所以我只是要去分類並看看它說什麼 – 2010-02-16 15:03:52

回答

8

終於設法追查到了這個問題。

該對象的主鍵是數據庫中的varchar。 NHibernate在運行查詢時將值轉換爲nvarchar。不幸的是,在NH Profiler中查看生成的sql時,這並不明顯。放緩和SQL轉換爲nvarchar回VARCHAR

造成我指定使用自定義類型

map.Id(x => x.Id).CustomType("AnsiString"); 

測繪和問題解決

乾杯所有幫助的人:)

+0

今天幫助我度過了美好時光。 – 2010-07-16 05:36:22

+0

我遇到了同樣的問題,這是一個很大的幫助。 – 2010-10-15 16:18:30

1

通常這些問題解決到網絡你和你的數據庫之間。 QA通常直接連接到數據庫,並且它所發送的所有數據都是原始數據的格式。您的應用可能會將您的結果集轉換爲數據集或類似的結構。爲了證明這一點,更改一些代碼(而不是整個數據層)以使用SQL數據讀取器來讀取數據。只需讀取所有記錄,而不嘗試解析所有列並保存數據。它的執行速度可能會像網絡允許的那樣快。

+0

我剛剛運行NHibernate使用數據讀取器生成的確切查詢,並且總執行時間剛好超過1ms,所以,不幸的是,它似乎不是一個網絡延遲問題 – 2010-02-16 14:56:11

+0

這就是我的觀點......現在嘗試讀取你的數據,並提取每一列到你的「行容器」,無論是什麼。你可能會看到一個緩慢的下降。 – 2010-02-17 00:29:04

+0

我剛剛重新運行此檢查,並創建連接,運行查詢(我對這個簡單的計數,使其儘可能簡單)和讀取數據,只需要超過一毫秒。 – 2010-02-17 10:30:29