我们使用ODP.NET对Oracle数据库进行查询,正常情况下运行良好。但是,有一个特定的数据库以及该数据库中的一个特定 View ,我们无法从 .NET 完成查询。例如:
SELECT some_varchar_field FROM the_view WHERE ROWNUM < 5;
如果我从 Oracle SQL Developer 中执行此查询,它会在不到一秒的时间内完成。如果我使用 ODP.NET 从 .NET 应用程序执行相同的查询,它会挂起并最终产生“ORA-03135:连接丢失联系”错误。我认为将其限制为几行可以消除 FetchSize 问题的可能性。
我可以成功执行其他查询,但它们在我们的程序中比在 SQL Developer 中慢。同样,我意识到 SQL Developer 最初只获取前 50 行的数据,但我认为 ROWNUM 条件将其排除在等式之外。
Oracle SQL Developer 使用的连接或命令与我们的应用程序使用的连接或命令可能有什么不同,从而导致速度差异?
不幸的是,我无权访问该服务器(除了对其运行 Oracle 查询之外)。
谢谢。
更新:我已经尝试使用 Microsoft 的 Oracle 提供商执行相同的查询,它执行得非常快。不幸的是,该提供程序已被弃用,因此这不是一个长期解决方案。
最佳答案
这与 ODP.NET 提供商无关。问题在于,我们用来为我们创建连接的库(当然,Oracle SQL Developer 不使用该库,而且我在尝试 Microsoft 提供程序时也没有使用该库)总是在执行任何操作之前执行以下语句:
ALTER SESSION SET NLS_COMP = LINGUISTIC
ALTER SESSION SET NLS_SORT = BINARY_CI
这些使得 Oracle 不区分大小写。但是,它们也使所有传统索引变得毫无用处。因为我们是从 View 查询,所以它内置了排序。而且因为我们不拥有数据库,所以我们无法使索引语言化来解决性能问题。
提供一种在这种(罕见)场景中不执行这些语句的方法解决了问题。
关于.net - Oracle 查询在 .NET 应用程序中运行缓慢(或失败),但在 SQL Developer 中运行很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655399/