如何诊断缓慢的NHibernate插入?

时间:2012-06-08 04:11:25

标签: sql-server nhibernate bulkinsert

我知道NHibernate并不打算进行批量插入,因为它比SqlBulkCopy慢约5倍,但我决定使用它来简化代码。

然而,我的代码并不慢5倍。它慢了2400倍。我正在插入约2500条记录。我已经关闭了log4net日志记录。我在发布模式下运行它。我没有使用id生成器(我通过整数计数器在代码中指定它)。我正在使用无状态会话。我已将批量大小设置为100(我可以更多,但似乎没有帮助)。我尝试重新添加生成器,但将其类设置为“已分配”。

我没有插入任何子元素。我已经确认正在进行批量插入。

还在调用SELECT SCOPE_IDENTITY()吗?但即便如此,那仍然是一个荒谬的时间。

我没有进行太多的批处理操作,所以我可以继续使用SqlBulkCopy进行此过程,但我担心我的整个应用程序运行得更快。

我没有NHProf的许可证,但我想知道现在是时候下载试用版了。

我正在使用带有Syscache2的NHibernate 3.3 GA - 但同样,我正在使用无状态会话。

您想要查看的所有HBM,配置或代码?建议?

由于

3 个答案:

答案 0 :(得分:2)

  

因为它比SqlBulkCopy

慢约5倍

你一定是在开玩笑。

NHibrnate会插入。使用批量插入(即命令中的多个插入语句),手写 - 我不认为NHibernate会这样做 - 我在特定项目中获得了大约400个插入。

使用SqlBUlkCopy我得到75000。

这不是5的因子,这是187的因子。

  

然而,我的代码并不慢5倍。它慢了2400倍

不是NHibernate的专家。记录连接 - 我认为NHibernate每批发送一个插入,这意味着很多处理速度慢等等,并且比我做过的东西(我的文本开头)要慢很多。

你到底得到了5倍因素?这是一个错误的开始。

  

我没有做太多的批处理操作,所以我可以继续使用SqlBulkCopy来完成这个过程,但是我很担心   我的整个应用程序运行得更快。

这是一个现实检查:当您需要极端选择或插入速度时,不要使用ORM。它们适用于业务规则繁重的对象 - 业务对象。当您最终进行批量插入或读取时,不要使用完整的ORM。很简单。

当你认为SqlBUlkCopy很快时,请检查: *在多个线程上运行多个SqlBulkCopy ... * ...然后进入临时表 * ...在select语句中使用一个插入将数据复制到最终表。

为什么呢?因为SqlBulkCopy对多线程有一些不良的锁定行为。这就是我得到它的方式。

AND:对于SqlBulkCopy,2500行是低的 - 设置开销很大(即在第1行之前)....所以你将获得更少的收益。我使用50k行批次。

NHibernate在线路上做什么?

  

我已经确认正在进行批量插入。

如何?您认为批量插入是什么?

桌子上是否有触发器?

答案 1 :(得分:0)

将带有一对long和字符串属性的10000个对象插入到我的devmashine上的本地mysql数据库中:

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

答案 2 :(得分:0)

我发现如果你做了很多插入,第一级缓存会阻塞并很快导致它慢下来爬行。您可以尝试使用无状态会话,也可以定期打开和关闭会话,即每5次插入。你当然会通过关闭会话来丢失交易等事情。

但最终,如果插入的行数超过100行,我会倾向于使用SqlBulkCopy,速度要快很多倍。