2010-02-16 120 views
4

这是使用流利NHibernateNHibernate花费很长时间来运行查询

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

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

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

正被填充的对象包含一个子类,但是这个孩子正在从NHibernate的第二级高速缓存

正在被返回的被寻呼的数据(50查询)加载虽然作为远据我所知,这应该没有什么区别

我也有计数运行,并且再次,这是根据NHProfiler在查询分析仪和约1800毫秒〜4ms。

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

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

+0

ADO.NET需要多长时间? – 2010-02-16 13:41:27

+0

当你用像蚂蚁或dottrace这样的剖析器来剖析代码时,主要的瓶颈是什么? – Paco 2010-02-16 14:51:37

+0

使用ADO.NET只需要NHibernate的一小部分时间。 我目前还没有安装任何性能分析软件,所以我只是要去分类并看看它说什么 – 2010-02-16 15:03:52

回答

8

终于设法追查到了这个问题。

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

造成我指定使用自定义类型

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

测绘和问题解决

干杯所有帮助的人:)

+0

今天帮助我度过了美好时光。 – 2010-07-16 05:36:22

+0

我遇到了同样的问题,这是一个很大的帮助。 – 2010-10-15 16:18:30

1

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

+0

我刚刚运行NHibernate使用数据读取器生成的确切查询,并且总执行时间刚好超过1ms,所以,不幸的是,它似乎不是一个网络延迟问题 – 2010-02-16 14:56:11

+0

这就是我的观点......现在尝试读取你的数据,并提取每一列到你的“行容器”,无论是什么。你可能会看到一个缓慢的下降。 – 2010-02-17 00:29:04

+0

我刚刚重新运行此检查,并创建连接,运行查询(我对这个简单的计数,使其尽可能简单)和读取数据,只需要超过一毫秒。 – 2010-02-17 10:30:29