Oracle NHibernate探查器中的查询持续时间

Oracle NHibernate探查器中的查询持续时间,oracle,nhibernate,fluent-nhibernate,profiling,nhprof,Oracle,Nhibernate,Fluent Nhibernate,Profiling,Nhprof,我有一个ASP.NETMVC应用程序,它使用FluentNHibernate访问oracle数据库。我还使用NHibernate探查器监视NHibernate生成的查询。我有一个非常简单的查询(从包含4个字符串列的表中选择所有行)。它用于创建CSV格式的报告。我的问题是,查询需要很长时间才能运行,我想对nhprof显示的持续时间有更多的了解。对于65000行,这需要10-20秒,即使“仅数据库”持续时间仅显示20毫秒。网络延迟不应该占用很多时间,因为服务器位于同一个千兆局域网上。我不希望人们能准

我有一个ASP.NETMVC应用程序,它使用FluentNHibernate访问oracle数据库。我还使用NHibernate探查器监视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 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位整数上连接两个表


我绝不是一个数据库专家,所以我很乐意听到所有能为我指明正确方向的评论。

总时间仅用于呼叫nHib查询。
但是,除了数据库中的时间外,它还包括nHib填充实体所需的时间(水合作用)。这很可能是你的罪魁祸首。
我有一些建议,也许会对你有所帮助

归根结底,nHib并非真的打算加载大型数据集。
如果我得到的建议没有一个对你有帮助,我会建议几件事:
1.用户不太可能同时需要查看65000行数据。也许您可以找到一种方法来过滤数据,使结果集更小(更可读)。

2.否则——如你所说,如果这是一种“特殊”情况,只有在生成报告时才会发生——你就不必使用nHib。比如说,您可以使用好的ol'ADO.Net类…

还有一个
ISTALESSESCESSION
专门用于这种情况。它没有会话缓存,节省了大量工作。应该快得多

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

您是否只读取、也更新、也获取相关数据、批量获取?我不是将数据插入数据库的人(另一个团队会这样做),因此我不确定更新/插入是如何完成的。我想当一张新票进入系统时,他们会一张接一张地这样做。如果这就是你的意思?关于获取:我确实以1000张票的批量获取数据,但是1000张票意味着从V_TICKET_DETAILS视图中获取650.000行,因此你可以说这是相当大的批量。。如果我将650.000行提取拆分为更小的批,它的性能会更好吗?1:这是一个处理票据的系统,每个票据在V_ticket_DETAILS视图中大约有65行。当用户试图生成1000多张票证的CSV报告时,就会出现此问题。他们希望获得每张票据的所有详细信息,因此有必要获取所有65k行。2:是的,我想你可能是对的,这对nhib来说不是一个好的案例,所以我可能想用ADO.Net来代替旧的ADO.Net来完成这个案例的工作。我不确定我是否会改用IStatelessSession,但由于Linq2NHibernate似乎不支持它,因此我不得不改变我的数据访问实现。所以这次我选择了ADO.Net解决方案,因为性能是一个重要的问题。