【问题标题】:NHibernate taking a long time to run queryNHibernate 需要很长时间才能运行查询
【发布时间】:2011-01-17 09:32:39
【问题描述】:

这是使用 Fluent NHibernate 完成的

我有一个 NHibernate 查找,它正在从一个表中检索数据。如果我使用生成的 sql 并通过查询分析器运行它,大约需要 18ms 才能运行。

使用 NHProfiler,我得到这个查询的持续时间为 ~1800 毫秒 - 比 sql 长 100 倍!

Query duration
 - Database only:1800ms
 - Total: 1806ms

正在填充的对象包含一个子类,但是这个子类是从 NHibernate 二级缓存加载的

返回的数据是分页的(每个查询 50 个),但据我所知,这应该没有任何区别

我还运行了一个计数,根据 NHProfiler,这在查询分析器中需要约 4 毫秒,而根据 NHProfiler,这需要约 1800 毫秒。

NH Profiler 是显示查询 执行时间,还是检索、映射类和构造对象图的完整时间?如果是前者 - 为什么它比直接运行查询要花这么长时间?

编辑:刚刚发现 Ayende 的这篇关于 NH Profiler 中给出的查询持续时间值的帖子:http://ayende.com/Blog/archive/2009/06/28/nh-prof-query-duration.aspx - 所以肯定是数据库的查询需要很长时间

【问题讨论】:

  • 使用 ADO.NET 需要多长时间?
  • 使用 ant 或 dottrace 之类的分析器分析代码时的主要瓶颈是什么?
  • 使用 ADO.NET 只需要 NHibernate 的一小部分时间。目前我还没有安装任何分析软件,所以我将对其进行排序并查看它的内容
  • Ants 显示整个过程只需要 160 毫秒,这是我的测试和 NH Profiler 告诉我的十分之一。我已经尝试在分离 NH Profiler 的情况下重新运行,以防出现问题,这也没有任何区别
  • 测量不同的时间会让人感到困惑。当您使用 System.Diagnostics.Stopwatch 来计时调用使用 NHibernate 和数据库的方法的代码的实际执行时,需要多长时间?我希望这能给你“真正的”时间。

标签: nhibernate fluent sql-server-profiler nhprof


【解决方案1】:

通常这些问题可以解决您与数据库之间的网络问题。 QA 通常直接连接到数据库,它所要做的只是将原始数据发送回格式化的地方。您的应用程序可能正在将您的结果集转换为数据集或类似结构。为了证明这一点,请更改一些代码(而不是整个数据层)以使用 SQL 数据阅读器来读取数据。只需读取所有记录,而无需尝试解析所有列并保存数据。它的执行速度可能与您的网络允许的一样快。

【讨论】:

  • 我刚刚运行了 NHibernate 使用数据读取器生成的确切查询,总执行时间刚刚超过 1 毫秒,所以很遗憾,这似乎不是网络延迟问题
  • 这就是我的意思...现在尝试读取您的数据并将每一列提取到您的“行容器”中。您可能会看到速度变慢。
  • 我刚刚重新运行它来检查,并创建连接,运行查询(我正在根据简单计数执行此操作以使其尽可能简单)并读取数据只需一毫秒。
【解决方案2】:

终于找到问题所在了。

对象的主键是数据库中的 varchar。 NHibernate 在运行查询时将值转换为 nvarchar。不幸的是,在 NH Profiler 中查看生成的 sql 时,这并不明显。减速是由于 sql 将 nvarchar 转换回 varchar

我已指定映射以使用自定义类型

map.Id(x => x.Id).CustomType("AnsiString");

问题解决了

为所有帮助的人干杯:)

【讨论】:

  • 今天这对我帮助很大。
  • 我也遇到了同样的问题,帮了大忙。
猜你喜欢
  • 2021-06-15
  • 2016-04-23
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 2021-12-25
  • 2016-06-17
相关资源
最近更新 更多