我有一个asp.net MVC应用程序,使用Fluent NHibernate访问oracle数据库。我还使用NHibernate Profiler来监控NHibernate生成的查询。我有一个查询,这是非常简单的(选择从4个字符串列表的所有行)。用于创建CSV格式的报表。我的问题是查询需要很长时间才能运行,我希望对nhprof显示的持续时间有更深入的了解。对于65000行,耗时10-20秒,尽管"仅数据库"持续时间仅显示20毫秒左右。网络延迟应该不会占用很多时间,因为服务器在同一个千兆局域网上。我不期望人们能够准确地为我指出瓶颈在哪里,但我想知道的是如何在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位数的整数上连接两个表。
我绝不是一个数据库专家,所以我很高兴所有的评论,将指出我在正确的方向。
总时间仅用于调用nHib查询。
但是,除了数据库中的时间之外,它还包括nHib填充实体所需的时间(水合作用)。这可能就是你的罪魁祸首。我也遇到过类似的问题,也许其中的一些建议会对你有所帮助。
最重要的是,nHib并不是真的打算加载大型数据集。
如果我得到的建议对你没有帮助,我将提出一些建议:
1. 您的用户不太可能需要同时查看65,000行数据。也许你可以找到一种方法来过滤数据,使结果集更小(更可读)。
2. 否则——如果像你说的那样,它是一个只在生成报告时发生的"特殊"情况——你就不必使用nHib。你可以直接使用,比如说,老旧的ADO。净类…
还有用于这种情况的IStatelessSession
。它没有会话缓存,节省了很多工作。它应该快很多。
using (var session = factory.OpenStatelessSession())
{
}