为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?

Posted

技术标签:

【中文标题】为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?【英文标题】:Why there is the difference in Oracle PL/SQL response time within SQL Developer vs. SQL Plus?为什么 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异? 【发布时间】:2010-08-04 17:25:40 【问题描述】:

我有一个 PL/SQL 函数,它返回包含 28 列和 8100 行的游标。当我从 SQL Plus 执行该函数时,我立即得到了结果,而在 SQL Developer 中,我正在运行需要很长时间(大约 80 秒)的脚本。 Java 代码也是如此。当列数减少到 2 时,我在不到 4 秒的时间内得到了响应。有人可以解释一下这种情况下发生了什么吗?

【问题讨论】:

SQL Developer 也是用 Java 编写的,而 SQL*Plus 是本机代码。所以有一个线索。你的桌子是什么样子的? 这是一个远程数据库吗?如果 SQL*Plus 与数据库在同一台服务器上运行,并且 SQL Developer 正在通过网络访问它,那么这可能是一个因素,特别是如果您有 LOB 数据,或者返回的列的大小未知(所以它必须分配比实际需要更多的内存和带宽)。大概您可以通过在本地运行 Java 版本来检查。也可以从 Java 中指定列大小,看看是否有帮助。 显然不是,SQL Developer 除了用于与数据库智能交互的简化工具(称为:SQLPLUS)之外,还有更多层。可能会降低性能的东西只是在屏幕上显示数据。如果您让大量数据在您的窗口上滚动,它可能会严重变慢。在这种情况下,只需将另一个不相关的窗口(Windows 资源管理器、浏览器、..)全屏,直到查询完成。 【参考方案1】:

最简单的实验是更改 SQL Developer 中的“SQL Array Fetch Size”,默认为 50。如果您看到将其增加到 500 的结果,那就是答案。

有趣的是,等效 SQLPlus 参数的默认值只有 15,但正如 APC 所说,SQLPlus 具有原生的优势。

如果更改“SQL Array Fetch Size”没有任何作用,接下来要看的是 JDBC 设置,SQL Developer 使用它而 SQL*Plus 没有。

【讨论】:

【参考方案2】:

除了我之前的好答案...

一旦返回第一行,SQL*PLus 就会将数据直接发送回屏幕,而 SQL Developer 必须在显示记录之前找到要返回的结果集的大小。

这可以解释为什么 SQL Developer 会出现延迟,尤其是在结果集很大或需要很长时间才能完全返回的情况下(例如,如果执行路径很复杂)。

【讨论】:

以上是关于为啥 SQL Developer 与 SQL Plus 中的 Oracle PL/SQL 响应时间存在差异?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ActiveRecord SQL 和 PL/SQL Developer SQL 之间存在差异?

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

PLSQL和PL/SQL Developer 12安装与配置

100天精通Oracle-实战系列(第8天)保姆级 PL/SQL Developer 安装与配置

100天精通Oracle-实战系列(第8天)保姆级 PL/SQL Developer 安装与配置