Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何诊断缓慢的NHibernate插入?_Sql Server_Nhibernate_Bulkinsert - Fatal编程技术网

Sql server 如何诊断缓慢的NHibernate插入?

Sql server 如何诊断缓慢的NHibernate插入?,sql-server,nhibernate,bulkinsert,Sql Server,Nhibernate,Bulkinsert,我知道NHibernate不打算进行批插入,因为它比SqlBulkCopy慢5倍左右,但我决定使用它来简化代码 然而,我的代码并没有慢5倍。速度慢了2400倍。我正在插入大约2500张唱片。我已关闭log4net日志记录。我在发布模式下运行它。我没有使用id生成器,而是通过整数计数器在代码中指定它。我正在使用无状态会话。我已经将批量设置为100,我可以再多做一些,但似乎没有帮助。我尝试重新添加生成器,但将其类设置为assigned 我没有插入任何子元素。我已经确认批量插入正在发生 它还在调用SE

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

然而,我的代码并没有慢5倍。速度慢了2400倍。我正在插入大约2500张唱片。我已关闭log4net日志记录。我在发布模式下运行它。我没有使用id生成器,而是通过整数计数器在代码中指定它。我正在使用无状态会话。我已经将批量设置为100,我可以再多做一些,但似乎没有帮助。我尝试重新添加生成器,但将其类设置为assigned

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

它还在调用SELECT SCOPE\u IDENTITY吗?但即使是这样,这仍然是一个荒谬的时间量

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

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

我将NHibernate 3.3 GA与Syscache2一起使用,但同样,我使用的是无状态会话

您想查看任何HBMs、配置或代码?建议

谢谢

因为它比SqlBulkCopy慢5倍左右

你一定是在开玩笑

NHibrnate做插入。使用成批插入,即在一个命令中手写多个插入语句——我认为NHibernate不会这样做——我在一个特定项目中得到了大约400个插入

使用SqlBUlkCopy我得到了75000

这不是5的系数,而是187的系数

然而,我的代码并没有慢5倍。慢了2400倍

不是NHibernate的专家。记录连接-我假设NHibernate每批发送一个插入,这意味着处理速度很慢,等等,并且比我在文本开头做的事情慢得多

你到底从哪里得到的5倍因子?这是一个错误的开始

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

这里有一个现实的检查:当您需要极端的选择或插入速度时,您不会使用ORM。它们用于业务规则重对象—业务对象。当您最终执行大容量插入或读取时,您不会使用完整的ORM。就这么简单

当您认为SqlBUlkCopy很快时,请检查以下内容: *在多个线程上运行多个SqlBulkCopy。。。 *…惰性化到临时表中,然后 *…使用一条insert into select语句将数据复制到最终表中

为什么??因为SqlBulkCopy对多线程有一些不好的锁定行为。我就是这样把它弄得那么高的

并且:SqlBulkCopy的2500行较低-设置开销很大,即在第1行之前。。。。因此,您将获得较少的收益。我使用50k行批次

NHibernate在电线层上做什么

我已经确认批量插入正在发生

怎么做?你认为批处理插件是什么?


表上有触发器吗?

在我的devmashine上向本地mysql数据库中插入10000个具有两个长字符串属性的对象需要:

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

我发现,如果你做了很多次插入,一级缓存就会阻塞,很快就会导致它慢下来爬行。您可以尝试使用无状态会话,也可以定期打开和关闭会话,即每插入5次。关闭会话当然会丢失事务之类的东西


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

插入2500个对象需要多少时间,你能提供插入2500个对象和映射的代码吗?这里有一些数字:即使他比真实值高一个数量级,差异也不是187,而是30倍;最重要的一点是,在过去的两年中,我主要做ETL加载例程,那里的性能非常关键。。。。所以我现在在这方面做得很好。同上。我主要从事数据迁移工作,在这种情况下,sql路径意味着大量的神秘列名和compositeId引用。调谐的NHibernate从来没有像您在这里显示的那样慢那么多量级。等待3小时而不是45分钟,但节省1个月的工作实现etl是值得的。@Firo,这是我在提出5倍索赔时使用的链接。SqlBulkCopy对于2500行来说是过度的,但是当NHibernate在一个无状态会话中需要3分钟来插入记录时,我不得不做一些事情,SqlBulkCopy需要77毫秒。我知道它正在进行批处理,因为如果我打开log4net和SQL日志,我可以看到批处理。我理解使用ORM的利弊,但如果我配置或实现得不好,那不是ORM的错。表上没有触发器。我认为2500条记录3分钟是多余的-每秒插入13次。我只是不知道
从哪里开始寻找。同意。即使使用非批处理和单个事务,13对于桌面来说也有点低。这超出了slow.session.Clear的范围,它也会清理缓存,但会保持事务打开