2012-06-08 59 views
3

我知道NHibernate並不是要做批量插入,因爲它比SqlBulkCopy慢5倍,但我決定使用它來代碼簡單。如何診斷緩慢的NHibernate插入?

但是,我的代碼沒有慢5倍。這是2400倍慢。我插入了大約2500條記錄。我關閉了log4net日誌記錄。我在發佈模式下運行它。我沒有使用id生成器(我通過一個整數計數器在代碼中指定它)。我正在使用無狀態會話。我已經設置了100的批處理大小(我可以走得更遠,但似乎沒有幫助)。我嘗試添加發生器,但將其類設置爲「已分配」。

我沒有插入任何子元素。我已經確認批量插入正在發生。

它仍在調用SELECT SCOPE_IDENTITY()嗎?但即使如此,這仍然是一個荒謬的時間。

我不會做太多的批量操作,所以我可以繼續使用SqlBulkCopy來處理這個過程,但是我擔心我的整個應用程序可能運行得更快。

我沒有NHProf的許可證,但我想知道現在是否可以下載試用版了。

我使用NHibernate 3.3 GA與Syscache2 - 但我再次使用無狀態會話。

您想查看的任何HBM,配置或代碼?建議?

感謝

+0

插入2500個物體需要多長時間? – ivowiblo

+2

另外,您能否提供插入2500個對象和映射的代碼? – ivowiblo

+0

你有任何IUsertypes? – Firo

回答

2

,因爲它是關於5倍比SqlBulkCopy的

你一定是在開玩笑慢。

NHibrnate確實插入。使用批量插入(即一個命令中有多個插入語句),手寫 - 我不認爲NHibernate會這樣做 - 我在特定項目中獲得了大約400個插入。

使用SqlBulkCopy的我得到了75000

,是不是5倍,也就是187的

然而,我的代碼不是5倍的速度較慢的一個因素。這是2400倍慢

不是NHibernate的專家。記錄連接 - 我會假設NHibernate每批發送一個插入,這意味着很多緩慢的處理等,並且比我的東西(我的文本開始)慢很多。

你從哪裏得到5倍的因子?這是一個錯誤的開始。

我沒有做太多的批量操作,這樣我就可以繼續使用SqlBulkCopy的這個過程,但我擔心 我的整個應用程序可以運行得更快。

這裏是一個現實檢查你:當你需要極端的選擇或插入速度時,你不使用ORM。他們在那裏爲業務規則重對象 - 業務對象。當您最終進行批量插入或讀取操作時,不要使用完整的ORM。那樣簡單。

當你想使用SqlBulkCopy快,看看這個:在多線程運行 *多SqlBulkCopy的... * ...惰到臨時表,然後 * ...使用一個INSERT INTO SELECT語句複製數據輸入到決賽桌。

爲什麼?因爲SqlBulkCopy對多線程有一些不好的鎖定行爲。這就是我如此高的。

AND:對於SqlBulkCopy,行數爲2500:安裝開銷很大(即在第1行之前)....所以你將獲得較少的增益。我使用5萬行批次。

NHibernate在線級上做什麼?

我已確認批量插入正在發生。

怎麼樣?你認爲什麼是批量插入?

桌子上是否有觸發器?

+0

這裏有一些數字:http://ayende.com/blog/4137/nhibernate-perf-tricks即使他比實際好一個數量級的差異是因素30不是187。 – Firo

+0

對我來說,它是;)點主要是在過去的2年裏,我大部分時間都是通過ETL加載重新編程的,而且性能還是超級重要的....所以我現在在這方面非常出色。 – TomTom

+0

dito。我主要在數據遷移的地方去sql路徑將意味着神祕的列名稱和compositeId引用集體。調整好的NHibernate從來沒有像你在這裏顯示的那麼慢。等待3小時而不是45分鐘,但保存1個月執行etl的工作非常值得。 – Firo

0

插入10000個對象與一對夫婦長期和字符串屬性爲我devmashine本地mysql數據庫需要:

StatelessSession: 4,6 seconds 
Session:   5,7 seconds 
0

我發現,如果你正在做許多刀片一級高速緩存中會阻塞並很快導致它放慢速度爬行。您可以嘗試使用無狀態會話或定期打開和關閉會話,即每5次插入一次。您當然會通過關閉會話來損失事務。

但最終,我傾向於使用SqlBulkCopy,如果我有超過大約100行插入,多次更快。

+0

session.Clear()也將清除緩存但保持事務處於打開狀態 – Firo