2012-06-08 35 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