各位老兄,小弟用各位刚才说的方法试了,正在进行中,但是我这边数据量实在是太大了。用 zhzhs007(统一猪) 的方法可行,现在想求教各位有没有提高效率的方法啊。1秒才20行左右,这样我100多W的数据,要崩溃了啊:( 下面是我在PL/SQL的执行代码,就是太慢啊……spool c:\table_name.csv; set heading off; --禁止输出列标题 select col1||','||col2||','||col3 from table_name; spool off;请教各位有没有提高效率的方法
按理100来万的数据量不大啊,就算笔记本上,用spool也不至于1秒才20行啊。spool时其实大量时间是花在在屏幕上显示结果了,这时用set termout off就可以关闭屏幕显示。 注意:set termout off 只在脚本中起作用对于你的问题,我的建议是: 1.建一脚本 exp.sql set heading off set termout off spool c:\table_name.csv select col1||','||col2||','||col3 from table_name; spool off2.在SQL plus 里执行脚本 SQL> @exp.sql相信速度会有一定提高。我们原来几亿条的数据也这么导出,应该没什么问题。
还没发现用终端直接导出csv文件的。
sunnyrain(旭雨) 说的我试过,可是我机器顶多打开14W条记录,然后就没空间了。不能全部显示在PL/SQL里。我知道你说的这个方法可行,可是数据量太大了。
170W记录EXCEL打不开的,它只能开6W多,我用的是UE打开。100个字段是因为那张表是宽表的衍生结果表。需要做分析的。
各位还有没有其他更好的方法啊?我说的是快捷一点的。拜托啦
你可以看一下脚本
这是一部分
echo "C_TIMATE、C_TIMATELIST增量数据开始抽取"`date`>>$etllog/$workdate/Exp__CtimateAll_Add_D.logsqlplus -s $lpusr/$lppwd@$lpsid <<EOF >/dev/null--set colsep ' || ';
set echo off;
set feedback off; --禁止显示最后一行的计数反馈信息
set heading off; --禁止输出列标题
set pagesize 0; --设置显示多少行打印一次列名
set linesize 1000;
set numwidth 12;
set termout off;
set trimout on; --清空多余的空格
set trimspool on;
set newpage none; --没有翻页,输出的文件没有空行
spool $ftpin/$workdate/Exp__CtimateAll.EXF;SELECT a.timateno||' || '||
a.seno||' || '||
a.itcode||' || '||
b.serialno||' || '||
b.timateamount||' || '||
b.itemcode||' || '||
b.item||' || '||
to_char(a.makedate,'YYYY-MM-DD HH24:MI:SS') ||' ||'
FROM c_timate a,c_timatelist b
WHERE a.timateno=b.timateno
AND a.makedate>=to_date(to_char($workdate)||'000000','yyyymmddHH24miss');
AND a.makedate<=to_date(to_char($enddate)||'235959','yyyymmddHH24miss');
spool off;
exit
EOF
你写的这个是前面 vivianfdlpw() 给的地址里的SPOOL 方法,我也试过了,可是就是无端端的多出了“-----”这个东东,前面我讲过了,每导出一行,就多出一行这个。让我郁闷着呢
比如这个
set heading off
下面是我在PL/SQL的执行代码,就是太慢啊……spool c:\table_name.csv;
set heading off; --禁止输出列标题
select col1||','||col2||','||col3 from table_name;
spool off;请教各位有没有提高效率的方法
注意:set termout off 只在脚本中起作用对于你的问题,我的建议是:
1.建一脚本 exp.sql
set heading off
set termout off
spool c:\table_name.csv
select
col1||','||col2||','||col3 from table_name;
spool off2.在SQL plus 里执行脚本
SQL> @exp.sql相信速度会有一定提高。我们原来几亿条的数据也这么导出,应该没什么问题。
如果这种导出是经常性的外,最好还是用一些专门的ETL工具,比如直接用于数据抽取的DataStage等。
我试的是一张128W记录的表.只有4个字段.只用了109秒..
主要实现思路:
1、声明一个纪录,用来存储导出的数据;
2、使用游标取数据到记录中;
3、使用utl_file将纪录中的数据写入文本文件;
4、循环执行步骤2和3,完成数据的导出。