NHibernate需要很长时间才能运行查询

时间:2010-02-16 13:03:53

标签: nhibernate fluent sqlprofiler nhprof

这是使用Fluent NHibernate

完成的

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

使用NHProfiler,我的查询持续时间为~1800ms - 比sql长100倍!

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

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

正在返回的数据被分页(每个查询50个)虽然据我所知,这应该没有任何区别

我还有一个计数运行,再次,这在查询分析器中需要大约4ms,根据NHProfiler需要大约1800ms。

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

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

2 个答案:

答案 0 :(得分:8)

最后设法追查问题。

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

引起的

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

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

问题解决了

为所有帮助人员干杯:)

答案 1 :(得分:1)

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