0

我有一个使用 Fluent NHibernate 访问 oracle 数据库的 ASP .Net MVC 应用程序。我还使用 NHibernate Profiler 来监控 NHibernate 生成的查询。我有一个非常简单的查询(从具有 4 个字符串列的表中选择所有行)。它用于创建 CSV 格式的报告。我的问题是查询需要很长时间才能运行,我想更深入地了解 nhprof 显示的持续时间。对于 65.000 行,它需要 10-20 秒,即使“仅数据库”持续时间仅显示 20 毫秒。这段时间网络延迟应该不会太多,因为服务器位于同一个千兆 LAN 上。我不指望人们能够准确地为我指出瓶颈在哪里,

“仅数据库”部分包含哪些内容,“总时间”部分包含哪些内容?总时间是否还包括填充 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 位整数上。

我绝不是数据库专家,所以我很高兴看到所有能够为我指明正确方向的评论。

4

2 回答 2

1

总时间仅用于调用 nHib 查询。
但是,除了数据库中的时间之外,它还包括 nHib 填充您的实体(水合作用)所需的时间。这可能是你的罪魁祸首。
我遇到了类似的问题,也许那里的一些建议可能对您有所帮助。

底线是 nHib 并不是真正打算加载大型数据集。
如果我得到的建议都没有帮助到您,我会提出以下几点建议:
1. 您的用户不太可能需要同时查看 65,000 行数据。也许您可以找到一种过滤数据的方法,以使结果集更小(并且更具可读性)。
2. 否则-如您所说,如果它是仅在您生成报告时发生的“特殊”情况-您不必使用nHib。你可以使用,比如说,好的 ol' ADO.Net 类......

于 2011-12-01T09:27:07.647 回答
0

还有IStatelessSession用于这种情况的。它没有会话缓存并节省了大量工作。它应该快很多。

using (var session = factory.OpenStatelessSession())
{
}
于 2011-12-01T10:11:55.760 回答