【发布时间】:2021-08-09 03:30:55
【问题描述】:
我正在尝试将一个中等复杂的查询导出到 CSV 文件。在开发过程中,我一直通过 SQL Developer 手动执行此操作,但现在我正在设置一个自动化流程,因此我转而使用 SQL*PLUS 进行导出。出于某种原因,SQL*PLUS 版本明显慢 比手动 SQL Developer 导出!怎么会这样?我认为 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
我正在使用批处理脚本 sqlplus -l -F -M "CSV ON" username/pass@server @script.sql 从 Windows 机器调用此查询
我尝试打开 arraysize 并将其设置为 100 到 10,000 之间的任意值,尝试将 rowprefetch 设置为 1000 或关闭,并尝试在我的调用脚本中删除 -F 和 -M 标志。我的线条长度变化很大,所以我可能无法将线条尺寸设置为小于 7500,所以我没有这样做,但我发现没有其他文章有其他似乎有帮助的想法。
奇怪的是我可以看到文件加载速度较慢。如果我只是在资源管理器中刷新文件本身,那么来自 SQL Developer 的导出只会以比来自 SQL*PLUS 的速度快得多的速度增长。当我点击刷新时,正在进行的 SQL Developer 导出速度超过 100k/s;正在进行的 SQL*PLUS 导出通常每 100k 至少需要几秒钟。这些都发生在同一台机器上。有什么不同??我错过了什么?
【问题讨论】:
-
sqlplus 一般输出到终端屏幕。即使您正在假脱机到一个文件,您也可能还输出到终端输出,这将是减慢您速度的一点。您可以尝试将 sqlplus 的输出通过管道传输到单独的文件,或者尝试使用
ctrl-O关闭输出,如果您使用的是支持该功能的系统,并查看是否可以提高速度 -
嗨,Jad,我的印象是
set termout off;阻止了它;不是这样吗?如果不是那么好了解管道。ctrl-0是什么? -
ctrl-(letter o) ...它会关闭屏幕的输出...如果它没有在终端窗口中显示任何内容,我可能是错的,但这不会让我感到惊讶如果是导致问题的终端 IO