这是使用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 - 所以它肯定是数据库的查询需要很长时间答案 0 :(得分:8)
最后设法追查问题。
对象的主键是数据库中的varchar。 NHibernate在运行查询时将值转换为nvarchar。不幸的是,在NH Profiler中查看生成的sql时,这并不明显。减速是由sql将nvarchar转换回varchar
引起的我已指定映射使用自定义类型
map.Id(x => x.Id).CustomType("AnsiString");
问题解决了
为所有帮助人员干杯:)
答案 1 :(得分:1)
通常这些问题会解决您与数据库之间的网络问题。 QA通常直接连接到数据库,它必须发送的所有内容都是格式化的原始数据。您的应用可能会将结果集转换为数据集或类似结构。为了证明这一点,请更改一些代码(而不是整个数据层)以使用SQL数据读取器来读取数据。只需读取所有记录,而不尝试解析所有列并保存数据。它的执行速度可能与网络允许的速度一样快。