2011-11-30 164 views
0

我有一个使用Fluent NHibernate访问oracle数据库的ASP .Net MVC应用程序。我也使用NHibernate Profiler监视由NHibernate生成的查询。我有一个非常简单的查询(从包含4个字符串列的表中选择所有行)。它用于创建CSV格式的报告。我的问题是查询运行时间很长,我希望更深入地了解nhprof显示的持续时间。对于65.000行,即使“仅数据库”持续时间仅显示20毫秒,也需要10-20秒。由于服务器位于同一千兆位局域网上,因此网络延迟不应该在这段时间内发挥很大的作用。我不希望人们能够准确指出瓶颈的位置,但我想知道的是关于如何阅读NHibernate分析器中的持续时间测量的更多细节。什么是包含在“数据库只有”部分,什么在NHibernate Profiler中查询持续时间

被列入“总时间”?总时间还包括填充C#对象之后的处理过程,因此这次实际上是针对整个http请求的?了解更多关于这将有希望使我能够消除一些因素。

这NHibernate的映射类的样子:

Table("V_TICKET_DETAILS"); 

CompositeId() 
    .KeyProperty(x => x.TicketId, "TICKET_ID") 
    .KeyProperty(x => x.Key, "COLUMN_NAME") 
    .KeyProperty(x => x.Parent, "PARENT_NAME"); 

Map(x => x.Value, "COLUMN_VALUE"); 

而且通过NH探查器生成的查询是这样的:

SELECT this_.TICKET_ID as TICKET1_35_0_, 
     this_.COLUMN_NAME as COLUMN2_35_0_, 
     this_.PARENT_NAME as PARENT3_35_0_, 
     this_.COLUMN_VALUE as COLUMN4_35_0_ 
FROM V_TICKET_DETAILS this_ 

的观点是非常简单的,只在连接两个表2位整数。

我绝不是一个数据库专家,所以我会很高兴的,将点我在正确的方向上的所有评论。

+0

你只读,还更新,也取批,取批吗? – Firo

+0

我不是一个将数据插入数据库的人(另一个团队这样做),所以我不确定更新/插入是如何完成的。我认为他们一个接一个地做这件事,因为一张新票入场了。如果那是你的意思? –

+0

关于抓取:我确实获取1000张票据的批量数据,但1000张票据表示650.000行来自V_TICKET_DETAILS视图,因此您可以说它是相当大的批次。如果我将650.000行抓取分成更小的话,性能会更好吗?批? –

回答

1

的总时间是调用只有nHib查询。
但是,除了db中的时间之外,它还包括nHib填充实体所需的时间(水合作用)。这可能是你的罪魁祸首。
我已经有a similar problem,也许有些建议可以帮助你。

的底线是nHib是不是真的打算来加载大型数据集。
如果没有的建议,我得到了帮助过你,我建议两件事:
1.这是不可能的,你的用户需要同时查看65,000行的数据。也许你可以找到一种方法来过滤数据,以便结果集更小(并且更可读)。
2.否则 - 如果是,就像您说的那样,只有在生成报告时才会出现“特殊”情况 - 您不必使用nHib。你可以使用,比如说,好醇” ADO.Net类...

+0

1:这是处理故障单的系统,每个故障单在V_TICKET_DETAILS视图中都有〜65行。当用户试图生产上1000+门票CSV报告出现问题。他们想为每张门票的所有细节,因此有必要获取所有65K行。 2:是的,我想你可能是正确的,这是不是nhib一个很好的例子,所以我可能想要做的ADO.Net代替 –

+0

平原老ADO.Net的确在这种情况下工作。不知道我是否会侥幸IStatelessSession代替,但因为它似乎并没有被Linq2NHibernate的支持,我将不得不无论如何改变我的数据访问实现。所以我去了ADO.Net解决这个时候,由于性能的问题。 –

0

还有IStatelessSession其意在这样的情况下。它没有会话缓存并节省了大量工作。它应该快很多。

using (var session = factory.OpenStatelessSession()) 
{ 
} 
+0

我就测试!谢谢! –