Oracle查询从.NET应用程序运行缓慢(或失败),但SQL Developer的运行速度很快

Gre*_*ter 10 .net oracle odp.net

我们使用ODP.NET在Oracle数据库上执行查询,通常它工作正常.但是,有一个特定的数据库,以及该数据库中的特定视图,我们无法从.NET完成查询.例如:

SELECT some_varchar_field FROM the_view WHERE ROWNUM < 5;
Run Code Online (Sandbox Code Playgroud)

如果我从Oracle SQL开发人员中执行此查询,则会在不到一秒的时间内完成.如果我使用ODP.NET从我们的.NET应用程序执行相同的查询,它会挂起并最终产生"ORA-03135:连接丢失联系"错误.我认为将其限制为几行可以消除它作为FetchSize问题的可能性.

我可以成功执行其他查询,但它们从我们的程序比从SQL Developer慢.再一次,我意识到SQL Developer最初只获取前50行的数据,但我认为ROWNUM条件取决于该等式.

Oracle SQL Developer使用的连接或命令与我们的应用程序使用的连接或命令有什么不同会导致速度差异?

不幸的是,我没有访问服务器(除了对它运行Oracle查询).

谢谢.

更新:我已经尝试与Microsoft的Oracle提供程序进行相同的查询,并且执行速度非常快.不幸的是,该提供商已被弃用,因此这不是一个长期解决方案.

Gre*_*ter 13

它与ODP.NET提供程序无关.问题是我们用来为我们创建连接的库(当然,Oracle SQL Developer没有使用它,我在尝试Microsoft提供程序时没有使用它)在执行任何操作之前总是执行以下语句:

ALTER SESSION SET NLS_COMP = LINGUISTIC
ALTER SESSION SET NLS_SORT = BINARY_CI
Run Code Online (Sandbox Code Playgroud)

这些使Oracle不区分大小写.但是,它们也使所有传统索引变得毫无用处.因为我们是从View查询的,所以它有内置的排序.而且因为我们不拥有数据库,所以我们无法使索引语言化来解决性能问题.

提供一种在这种(罕见)场景中不执行这些语句的方法可以解决问题.

  • 您是如何发现正在使用的库正在执行这些语句的?我有一个类似的场景:立即在 Oracle Sql Developer 中,但在应用程序中几秒钟。在 Sql Server 上测试完全相同的场景确实更快。也许我错过了一些重要的配置。 (2认同)

Gar*_*ers 5

立即想到的是

  1. CLOB、BLOB 或 LONG/LONG RAW,仅几行就需要大量带宽。
  2. 无效数据(例如,有一些方法可以将无效日期输入日期字段,这可能会使某些客户感到困惑)
  3. “the_table”实际上不是一个表,而是一个视图或具有复杂派生的东西,或者具有 VPD/RLS/FGAC 安全策略。
  4. 奇异数据类型(空间或用户定义)。

建议

  1. 显式列出列(例如 SELECT a,b,c FROM the_table WHERE ROWNUM < 5)。一一添加列,直到它停止工作。假设表中至少有一个“简单”列。
  2. 检查 v$session 中的会话以查看等待事件是什么。数据库服务器要么正在为此 SQL 消耗 CPU,要么正在等待某些东西(可能是客户端)。
  3. 检查v$sql 中的SQL。是否有一个或多个子游标。是否有一个或多个 PLAN_HASH_VALUE。不同的子游标可以使用不同的计划。如果没有 ROWNUM 之外的 WHERE 子句,这种情况几乎不可能发生。