如果您在sql developer中用静态变量替换绑定变量,那么您并不真正运行相同的测试。确保你使用绑定变量,并且如果速度太慢,你只是由于一个糟糕的缓存执行计划而陷入困境。更新该表上的统计数据应该解决它。
但是,如果您实际上在SQL开发人员中使用绑定变量,请继续阅读。 TLDR版本是ODP.net运行的参数有时会导致稍微更悲观的方法。从更新统计开始,但让你的dba在两种情况下捕捉执行计划并进行比较以确认。
我从这里重新发布我的回答:https://stackoverflow.com/a/14712992/852208 我认为你标记为重复的,但你的标题是有点更简洁,因为它识别查询并在SQL Developer中跑得快。我会以另一种方式欢迎处理意见。
将以下内容添加到您的配置将发送odp。网络追踪信息记录到日志文件:
这可能只会是有益的,如果你能及时发现有很大的差距。实际上,行正在进入,只是速度较慢。
尝试在连接字符串中添加“enlist = false”。我不认为这是一个解决方案,因为它会有效地禁用分布式事务,但它应该可以帮助您隔离问题。您可以从Oracle forumns后得到一点点信息:
从ODP角度来看,所有我们真的可以指出的是,当OCI_ATR_EXTERNAL_NAME和OCI_ATR_INTERNAL_NAME 是底层的OCI连接上设置发生 行为(当 distrib tx support启用时会发生什么情况)。
我猜你没有看到的是,该执行计划实际上是不同的odp.net调用和SQL Developer的通话之间(指实际的性能损失实际上是存在的服务器上)。让dba跟踪连接,并从odp.net调用和直接从SQL Developer调用(或使用enlist = false参数)获取执行计划。
如果您确认不同的执行计划或者您想在黑暗中抢先拍摄,请更新相关表格的统计数据。在我的情况下,这纠正了这个问题,表明执行计划生成并不真正遵循不同类型连接的不同规则,但是在涉及分布式事务时,成本分析只是略微更加轻松。查询提示以强制执行计划也是一种选择,但仅作为最后的手段。
最后,它可能是一个网络问题。如果您的odp.net安装使用新的oracle主目录(除非您进行了一些安装后配置,否则我会期待),那么tnsnames.ora可能会有所不同。 tnsnams中的主机名可能不完全合格,从而导致解决服务器更多延迟。我只希望在这种情况下第一次尝试(而不是后续的尝试)速度缓慢,所以我不认为这是问题,但我认为应该提及。
我不知道是否这是在不同的优化器设置(如first_rows vs all_rows)在c#vs sql开发人员。有关更多信息,请参阅[Tom Kyte撰写的此文章](http://www.oracle.com/technetwork/issue-archive/2008/08-may/o38asktom-085659.html)。也许你可以检查v $ sql和v $ sql_shared_cursor来查看你是否有多行用于同一个sql语句,如果是这样,是否有不同的优化器模式是问题? – Boneist 2015-02-10 16:44:45