4

这是使用 Fluent NHibernate 完成的

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

使用 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 - 所以肯定是查询耗时较长的数据库

4

2 回答 2

8

终于设法找到了问题所在。

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

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

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

问题就解决了

为所有帮助的人干杯:)

于 2010-02-17T12:25:52.657 回答
1

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

于 2010-02-16T13:12:28.583 回答