我有一个ASP .Net MVC应用程序,它使用Fluent NHibernate访问oracle数据库。我还使用NHibernate Profiler来监视NHibernate生成的查询。我有一个非常简单的查询(从包含4个字符串列的表中选择所有行)。它用于以CSV格式创建报告。我的问题是查询运行时间很长,我想更深入地了解nhprof显示的持续时间。有65.000行,即使“仅数据库”持续时间仅显示20毫秒,也需要10-20秒。网络延迟不应该在很多时候出现,因为服务器位于同一千兆位LAN上。我不希望人们能够准确地找到瓶颈的确切位置,但我想知道的是有关如何在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 profiler生成的查询是这样的:
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 :(得分:1)
总时间仅用于调用nHib查询 但是,除了db中的时间外,它还包括nHib填充实体所需的时间(水合)。这可能是你的罪魁祸首 我有a similar problem,也许有些建议可能对你有所帮助。
底线是nHib并不是真正意图加载大型数据集
如果我得到的建议都没有帮助你,我会建议一些事情:
1.您的用户不太可能同时查看65,000行数据。也许您可以找到一种过滤数据的方法,以便结果集更小(更易读)
2.否则 - 如果是,如你所说,只有在生成报告时才会出现“特殊”情况 - 您不必使用nHib。你可以使用比较好的'ADO.Net类......
答案 1 :(得分:0)
还有IStatelessSession
用于此类情况。它没有会话缓存并节省了大量工作。它应该快得多。
using (var session = factory.OpenStatelessSession())
{
}