gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:15:16 26 4
gpt4 key购买 nike

我知道 NHibernate 并不适合批量插入,因为它比 SqlBulkCopy 慢 5 倍左右,但我决定使用它来简化代码。

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

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

它是否仍在调用 SELECT SCOPE_IDENTITY()?但即使是这样,这仍然是一段荒谬的时间。

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

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

我将 NHibernate 3.3 GA 与 Syscache2 结合使用——但同样,我使用的是无状态 session 。

您想查看任何 HBM、配置或代码吗?有什么建议吗?

谢谢

最佳答案

because it's about 5x slower than SqlBulkCopy

你一定是在开玩笑。

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

使用 SqlBUlkCopy 我得到了 75000。

这不是 5 的因数,而是 187 的因数。

However, my code's not 5x slower. It's 2400x slower

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

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

I don't do too many batch operations, so I can continue to use SqlBulkCopy for this process, but I'm concerned that my entire application could be running faster.

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

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

为什么?因为 SqlBulkCopy 对多线程有一些不好的锁定行为。这就是我达到那么高的原因。

并且:SqlBulkCopy 的 2500 行很低 - 设置开销很大(即在第 1 行之前)......所以你会得到更少的 yield 。我使用 50k 行批处理。

NHibernate 在线上做什么?

I've confirmed the batch inserts are occurring.

如何?您如何看待批量插入?

table 上有触发器吗?

关于sql-server - 如何诊断缓慢的 NHibernate 插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com