我正在使用sql plus执行查询(选择)并使用spool选项将结果转储到文件中。 我有大约1400万行,并且大约需要12分钟才能完成转储。 我想知道是否有什么可以使转储更快?
下面是我的sql plus选项:
whenever sqlerror exit sql.sqlcode
set pagesize 0
set linesize 410
SET trimspool ON
set heading on
set feedback off
set echo off
set termout off
spool file_to_dump_into.txt
select * from mytable;
感谢。
答案 0 :(得分:6)
你是否连接&分隔列,还是导出固定宽度?
请参阅SQL*Plus Script Tuning上的此文档。特定于您的脚本,以下是一些加速它的可能方法:
希望这有帮助!
答案 1 :(得分:2)
你可能会发现使用UTL_FILE更快,但可能没那么快。
在我的测试中,它在大约20k的行上稍快一点,然后超过1400万行,这可能是值得的。
我相信如果你想要比这更快,那么前进的方式就是亲...但我还没有进入,所以不能真正建议。
set pagesize 1000
set FLUSH OFF
drop user usera cascade;
create user usera default tablespace users identified by abc123;
grant create session to usera;
grant resource to usera;
create or replace directory testdir as '/tmp';
grant read,write on directory testdir to usera;
grant execute on UTL_FILE to usera;
connect usera/abc123;
set timing on
spool /tmp/spooltest.txt
select object_name from all_objects;
spool off
DECLARE
v_file UTL_FILE.FILE_TYPE;
TYPE t_col is table of all_objects.object_name%type index by PLS_INTEGER;
v_object_names t_col;
BEGIN
v_file := UTL_FILE.FOPEN('TESTDIR','utlfiletext.txt','w');
select object_name BULK COLLECT INTO v_object_names
from all_objects;
for idx IN 1 .. v_object_names.COUNT LOOP
UTL_FILE.PUT_LINE(v_file, v_object_names(idx), FALSE);
END LOOP;
UTL_FILE.FCLOSE(v_file);
END;
/
结果。最重要的结果来自sqlplus,底部使用UTL_FILE
23931 rows selected.
Elapsed: 00:00:06.60
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.45
答案 2 :(得分:1)
对于典型的查询,14M
记录至少有几百兆字节的数据要从服务器中取出,通过连接并保存到磁盘。
鉴于此,12
分钟对我来说听起来不太多。
但是,您的查询仍有可能得到优化。你能在这里发帖吗?
答案 3 :(得分:1)
这是通过电线还是你登录到拥有数据库的盒子?如果您有权访问,也许您可以在数据库所在的框中运行sqlplus会话并将文件压缩,然后将文件发送到本地计算机。通过线路发送大文件而不是发送数百万个较小的记录可能会更快。当然,这不会让它超级快,但可能会浪费一些时间。
还有那么多数据你真的需要将它假脱机到文件吗?你可以做出口吗?
答案 4 :(得分:0)
您可以通过添加脚本
来启用输出缓冲SET FLUSH OFF
但结果取决于您的操作系统。
答案 5 :(得分:0)
当从SQL * Plus中的查询中获得大量结果时,我发现花费大量时间的一件事是实际显示数据。如果您将数据假脱机到文件,则可以SET TERMOUT OFF
,并且查询运行得更快,因为它不必花时间将其写入屏幕。
答案 6 :(得分:0)
Tom Kyte提供了一些选项,他们是真正的大师。