SQL*Plus CSV 导出速度比 SQL 开发人员慢

SQL*Plus CSV Export slower than SQL Developer

我正在尝试将中等复杂的查询导出到 CSV 文件。在开发过程中,我一直通过 SQL Developer 手动执行此操作,但现在我正在设置一个自动化流程,所以我转而使用 SQL*PLUS 进行导出。出于某种原因,SQL*PLUS 版本比手动 SQL 开发人员导出 !怎么会这样?我认为 SQL*PLUS 的速度更快。

以下是我使用的标题:

set termout off;
set verify off;
set flush off;
set pagesize 0;

column tm new_value file_name noprint
select to_char(sysdate, 'YYYYMMDD') || '_filename.csv' tm from dual ;

SET markup csv on;
set echo off;
set feedback off
-- set rowprefetch 1000
-- set arraysize 100

SPOOL &file_name

SELECT ....*querygoeshere*
spool off;
exit

我正在使用批处理脚本从 windows 机器上调用此查询 sqlplus -l -F -M "CSV ON" username/pass@server @script.sql

我尝试打开数组大小并将其设置为 100 到 10,000 之间的任何值,尝试将 rowprefetch 设置为 1000 或关闭,并尝试删除调用脚本中的 -F 和 -M 标志。我的行长度变化很大,所以我可能无法将行大小设置为小于 7500,所以我没有这样做,但我发现没有其他文章有其他想法似乎有帮助。

奇怪的是我发现文件加载速度变慢了。如果我只是在资源管理器中刷新文件本身,那么从 SQL Developer 导出的文件的增长速度要比从 SQL*PLUS 导出的文件快得多。当我点击刷新时,SQL 正在进行的开发人员导出速度跃升超过 100k/s; SQL*PLUS 正在进行的导出通常至少每 100k 需要几秒钟。这些都发生在同一台机器上;有什么不同??我错过了什么?

事实证明,在测试不同设置几天后,更好的方法是切换到 SQLcl。它支持 sql*plus 脚本,但似乎工作得更快;与 SQL 开发人员导出速度相当,甚至更好(这是我首先希望的性能!)。切换到它,并将我的脚本中的 SET markup csv on; 替换为 SET SQLFORMAT CSV 保持相同的结果,但导致 大量 速度增加而没有进一步的变化。显然我从 sql*plus 开始是错误的,应该从 SQLcl.

开始

其他人值得注意的是,许多讨论 sql*plus being faster 的问题、博客和论坛似乎都是针对早期版本的 oracle。在撰写本文时,到 2021 年年中,SQLcl 似乎可能是提高速度的更好方法。或者至少,这对我来说非常重要。