NHibernate+Oracle:查询数据时的速度问题

NHibernate+Oracle:查询数据时的速度问题,oracle,nhibernate,castle-activerecord,Oracle,Nhibernate,Castle Activerecord,我们有一个WCF应用程序,它使用NHibernate从数据库查询数据。在将应用程序安装到新的测试环境中之后,我们在查询方面面临一些性能问题。我们的新旧环境使用不同的Oracle服务器,但这两个数据库具有相同的数据 我们已经查看了NHibernate日志,并确定了有问题的部分: 2010-12-02 07:14:22,673 NHibernate.SQL - SELECT this_.CC... 2010-12-02 07:14:22,688 NHibernate.

我们有一个WCF应用程序,它使用NHibernate从数据库查询数据。在将应用程序安装到新的测试环境中之后,我们在查询方面面临一些性能问题。我们的新旧环境使用不同的Oracle服务器,但这两个数据库具有相同的数据

我们已经查看了NHibernate日志,并确定了有问题的部分:

2010-12-02 07:14:22,673 NHibernate.SQL                 - SELECT this_.CC...
2010-12-02 07:14:22,688 NHibernate.Loader.Loader       - processing result set
2010-12-02 07:14:27,235 NHibernate.Loader.Loader       - result set row: 0
在本例中,查询返回一行。但是,在我们的新环境中,处理结果集所用的时间似乎比在其他环境中所用的时间长5秒,而不是0.5秒。有没有什么方法可以准确地找出处理结果集中花了这么长时间的内容

注意。使用Toad直接向数据库执行相同的精确查询不会重现问题。使用Toad,两个数据库服务器的速度都相同

我们使用DetachedCriteria创建查询,然后执行如下操作:

        Dim criteria As ICriteria = crit.GetExecutableCriteria(GetSession())
        Return New Generic.List(Of T)(criteria.List(Of T))
NHibernate的版本是2.1.2.4,我们使用ActiveRecord 2.1.0创建映射。Oracle服务器的版本为10g

因此,在本例中,我们有两个环境,它们具有相同版本的应用程序和相同的配置文件,并且正在查询相同的数据库,但是它们具有不同的应用程序和oracle服务器。在一个环境中,通过NHibernate进行查询大约需要5.5秒,而在另一个环境中则需要0.5秒。结果是一致的,对这两种环境执行了大约50次相同的查询

Oracle配置中是否存在可能导致其与NHiberate行为不当的内容?是否有一种方法可以从NHibernate获得更详细的注销信息,以便能够发现处理结果集中的确切问题


非常感谢您的建议。

将以下语句添加到会话中,对两种环境进行sql跟踪:

alter session set timed_statistics=true; alter session set max_dump_file_size=unlimited; alter session set事件“10046跟踪名称上下文永久,级别8”

-你的问题就在这里 从mytable中选择*,其中x=1

更改会话设置事件“10046跟踪名称上下文关闭”

然后使用tkprof检查跟踪文件转到用户\u dump\u dest,通常是一个名称为udump、tkprof outputfile.log inputraceFileName.trc的目录

tkprof型

自行查看帮助屏幕和命令选项

检查您在INIT.ORA中使用的设置是否与游标共享=


在这两个数据库中,我们都能够通过将数据库驱动程序从Microsoft的切换到Oracle的ODP.net来解决问题。现在,两台服务器的速度都一样快,甚至我们以前的快速服务器执行查询的速度也要快得多。我们不知道新服务器中的什么设置使Microsoft的Oracle驱动程序如此缓慢


现在,微软似乎建议每个人都使用自己的Oracle驱动程序以外的其他驱动程序

很难说。。新的测试环境和db服务器之间是否存在网络瓶颈?您是否尝试从WCF服务器运行Toad?为了消除数据库导致的问题,您可以跟踪会话并比较新旧会话的结果。可能是sql开发人员在新数据库和旧数据库上显式地将会话参数默认设置为不同的值。谢谢你们的评论。我们最终能够通过切换驱动程序来解决问题。您对nhibernate日志条目的完整描述帮助我使用nhibernate 3.0识别了相同的问题。感谢George提供的详细帖子。我们最终能够通过更改.NET Oracle驱动程序来解决问题。