NHibernate Profiler - 数据库持续时间和总持续时间之间存在巨大差异?

时间:2011-01-07 16:40:29

标签: nhibernate fluent-nhibernate nhprof

我有一个广泛使用NHibernate的应用程序。我已经开始使用NHibernate Profiler来识别可能的性能问题。我的问题与查询持续时间统计数据有关。

统计数据在数据库持续时间和总持续时间中细分。据我所读,数字应该非常接近。然而,我看到相对较大的差异,我正试图弄清楚这些的来源。这是一些数据

alt text

关于我可以从哪里开始解决这些问题的想法?

4 个答案:

答案 0 :(得分:6)

您的应用程序是否使用log4net?如果是这样,您应该检查您的log4net配置并调低您从NHibernate记录的数据量。

我正在处理的项目示例:对于返回60行/对象的查询,将DEBUG级别的所有NHibernate日志消息记录到文件会将NHProf的总报告持续时间从8ms增加到大约8000ms! / p>

限制NHibernate输出的配置示例:

<root>
    <level value="ALL" />
    <appender-ref ref="console" />
    <appender-ref ref="trace" />
</root>

<logger name="NHibernate">
    <level value="WARN" />
</logger>

如果这不能解决您的问题,也许您可​​以使用dotTrace或ANTS Profiler等性能分析工具来识别代码中的潜在瓶颈。这将使您清楚地了解/ NHibernate代码中的哪些方法花费了大量时间。

答案 1 :(得分:0)

您好,我不认为您正在寻找合适的地方。您不应该查看数据库持续时间等。一旦达到dB lvl,您就无法执行该操作。

相反,您应该关注的是您向数据库发送了多少查询。您可以通过避免冗余调用或缓存某些查询来以某种方式最小化它们。您是仅检索与您有关的属性,还是将整个对象加载到内存中然后进行处理。

您还在使用什么平台,我可能会建议您使用更好的工具来识别应用中的瓶颈。

希望有所帮助。

答案 2 :(得分:0)

我不知道这个事实,但我总是假设Total duration添加构建SQL查询的所有NHibernate开销,以及使用原始数据构建实体的数据检索。

也许您的实体的构建过程非常缓慢?您是否在实体构造函数中进行了大量处理?任何IO操作,日志记录,附加数据库访问,网络使用......

祝你好运

答案 3 :(得分:0)

第一个结果是从DB执行和检索结果所花费的时间。 第二个结果是NHibernate在内存中加载相应实体所需的时间。

我现在在一个项目中工作,它利用了一个非常大的实体(几乎100列/字段)。如果我尝试加载几千,它也将需要几秒钟。 但是,sql-query将在几毫秒内返回entity-id列表。但是要将这些ID实际加载到相应的实体中,如果你的entites是大型或复杂的对象,则会产生额外的开销(参见上面的帖子)。

您是否收到生成的查询的警报? NHibernate Profiler中持续时间旁边的列。

祝你好运,
的Mattias