我知道NHibernate并不打算进行批量插入,因为它比SqlBulkCopy慢约5倍,但我决定使用它来简化代码。
然而,我的代码并不慢5倍。它慢了2400倍。我正在插入约2500条记录。我已经关闭了log4net日志记录。我在发布模式下运行它。我没有使用id生成器(我通过整数计数器在代码中指定它)。我正在使用无状态会话。我已将批量大小设置为100(我可以更多,但似乎没有帮助)。我尝试重新添加生成器,但将其类设置为“已分配”。
我没有插入任何子元素。我已经确认正在进行批量插入。
还在调用SELECT SCOPE_IDENTITY()吗?但即便如此,那仍然是一个荒谬的时间。
我没有进行太多的批处理操作,所以我可以继续使用SqlBulkCopy进行此过程,但我担心我的整个应用程序运行得更快。
我没有NHProf的许可证,但我想知道现在是时候下载试用版了。
我正在使用带有Syscache2的NHibernate 3.3 GA - 但同样,我正在使用无状态会话。
您想要查看的所有HBM,配置或代码?建议?
由于
答案 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,速度要快很多倍。