oracle sql加spool

时间:2010-04-01 12:50:29

标签: sql oracle sqlplus spool

我正在使用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;

感谢。

7 个答案:

答案 0 :(得分:6)

你是否连接&分隔列,还是导出固定宽度?

请参阅SQL*Plus Script Tuning上的此文档。特定于您的脚本,以下是一些加速它的可能方法:

  1. 确保LINESIZE尽可能小。添加最大列长度(如果不是固定宽度,则加上分隔符)。这会对性能产生巨大影响,因为SQL * Plus会为每个导出的行分配大量内存。 410并不是那么大,但如果你可以减少它会有所帮助。根据我的经验,这已经产生了很大的不同。
  2. 不要打开TRIMSPOOL。这也可能产生很大的影响。然后将每一行填充到LINESIZE,但是使用最佳的线条大小,并且根据您使用文件的方式,这可能是可接受的。但是,如果您想完全消除尾随空格,则在导出后使用其他方法修剪它们通常会更快。
  3. 玩ARRAYSIZE。它可能有所帮助(一点点)。它设置SQL * Plus的提取大小。默认值为15行。比如100,可能会有所帮助,但过大可能会降低速度。
  4. 希望这有帮助!

答案 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提供了一些选项,他们是真正的大师。