oracle导出多CSV文件的问题

----------------------------------------------------------------------

用ksh脚本从oracle数据库中导出80w数据到csv文件,如用户给定名字为a.csv(文件最大4000行记录),则自动生产文件为a_1.csv,a_2.csv,...., a_200.csv

我已经实现了一个方法,但80w要导5小时,用户没法接受。如下:
sqlplus -s user/pwd @${SqlDir}/select_log.sql >/tmp/a.tmp
然后每read 4000行到文件a_1.csv,并且每隔4000行换一个文件名。

大家有什么好方法吗?注意效率

----------------------------------------------------------------------

先一次性生成一个csv文件
再用split分割文件

--------------------------------------------------------

完全赞同楼上说的。

关于性能问题,用oracle spool出80万行纪录是非常快的,我刚试了一下,再hp-ux下,spool出某表中100万纪录(2列)耗时大约2分钟,输出文件80m, 用split命令分割为每个4000行的文件耗时数秒而已。 下附测试代码:

/* sql file:  spool_test.sql */
set pages 0
set head off
set echo off
set feedback off
spool spool_text.csv
select col1, col2 from my_table where rownum<1000000;
spool off
exit

## shell script to spool out:
sqlplus -s user/password @spool_test.sql > /dev/null

## split file:
split -l 4000 spool_text.csv splited

--------------------------------------------------------

export.sh

#Generate the sql language
echo "SET HEADING OFF;">${SqlDir}/select_log.sql
echo "SET FEEDBACK OFF;">>${SqlDir}/select_log.sql
echo "SET LINESIZE 10000;">>${SqlDir}/select_log.sql
echo "SPOOL ${SqlDir}/EXPORT_ALL.CSV;" >> ${SqlDir}/select_log.sql
echo "SELECT SALESMAN_ID||','||">>${SqlDir}/select_log.sql
echo "SALESMAN_NAME||','||">>${SqlDir}/select_log.sql
echo "SALES_AMOUNT||','||">>${SqlDir}/select_log.sql
echo "SALES_DATE from sales_range;">>${SqlDir}/select_log.sql
echo "SPOOL OFF;" >> ${SqlDir}/select_log.sql
echo exit | ${ORACLE_HOME}/bin/sqlplus -s omc_sbardz812/omc_sbardz812 @${SqlDir}
/select_log.sql >/dev/null

split -l 4000 -a 5 ${SqlDir}/EXPORT_ALL.CSV log_20060606_
=============================================================

以上是我的脚本,80w数据我用了3个多小时还没完呢。有问题吗?
另外,很重要的一点,split后,再不是csv后缀了。看来还得文件遍历,然后一个一个的mv 成csv文件。

--------------------------------------------------------

先整个导出罢,然后在处理

--------------------------------------------------------

你的代码看起来没有问题,但80万条记录导3小时没完成很难让人理解。

你用sqlplus做一下测试,比如导出10000条记录需要多少时间,如果确实很慢,那可能是连接太慢(网络速度?)。

--------------------------------------------------------

导出为csv文件很快,就几分钟而已,但是split要花3个小时,共250个文件,每个文件4000行。我的机器是SUN Blade 150,还有我在server上运行的,不存在网络速度的问题。

--------------------------------------------------------

根据需要导出的列,单独建个临时表,比如:create table sales_range_tmp as select salesman_id,salesman_name,sales_amount,sales_date from sales;

再利用脚本导出来,看看速度应该有所提高。不过有一点必须明白,全扫描8w的表数据肯定不是几分钟可以完成的,何况要写成物理文件。

--------------------------------------------------------

KingSunSha(弱水三千),我用spool导出的文件大小为9G(8900828448byte on solaris),而你的才80M

--------------------------------------------------------

SELECT 中不要拼接字符串,非常影响速度

--------------------------------------------------------

大家还有好的办法吗?

--------------------------------------------------------

9GB = 9,216 MB = 9,437,184 KB = 9,663,676,416 Bytes
800,000 records
size of each record (line) = 9GB/800,000 = 12,079 Bytes

select 中只有 4 列(SALESMAN_ID, SALESMAN_NAME, SALES_AMOUNT, SALES_DATE
),你觉得每行纪录占12KB合理吗?

--------------------------------------------------------

问题是你在sqlplus中用了set linesize=100000,所以每行都会spool出100000bytes。
解决这个问题很简单,在spool开始之前加上两行set命令

set trimspool on
set termout off

第一个set是指定trim spool出的每行在行末的空格
第二个set是指定只spool而不回显,所以在运行sqlplus的时候不需要 >/dev/null。

--------------------------------------------------------

非常感谢KingSunSha(弱水三千),现在我把linesize改为100,非常快,2分钟就完成了。太好了。不过还有一个问题,导出的文件,每隔13行就会自动设置一个空行,能把这个去掉吗?因为我导出的文件会被我的程序打开的。

--------------------------------------------------------

just add 
set pagesize 0
before spool to suppress all headings, page breaks, titles, the initial blank line, and other formatting information.

--------------------------------------------------------

just add
set pagesize 0
before spool to suppress all headings, page breaks, titles, the initial blank line, and other formatting information.

--------------------------------------------------------

非常感谢KingSunSha(弱水三千),搞定了,贴出来吧,共享!

echo "SET HEADING OFF;">${SqlDir}/select_log.sql 
echo "SET FEEDBACK OFF;">>${SqlDir}/select_log.sql 
echo "SET LINESIZE 500;">>${SqlDir}/select_log.sql 
echo "SET trimspool on;">>${SqlDir}/select_log.sql 
echo "SET termout off;" >>${SqlDir}/select_log.sql 
echo "SET NEWPAGE NONE;" >>${SqlDir}/select_log.sql 
echo "SPOOL ${SqlDir}/EXPORT_ALL.CSV;" >> ${SqlDir}/select_log.sql 
echo "SELECT SALESMAN_ID||','||">>${SqlDir}/select_log.sql 
echo "SALESMAN_NAME||','||">>${SqlDir}/select_log.sql 
echo "SALES_AMOUNT||','||">>${SqlDir}/select_log.sql 
echo "SALES_DATE from sales_range;">>${SqlDir}/select_log.sql 
echo "SPOOL OFF;" >> ${SqlDir}/select_log.sql 
echo exit | ${ORACLE_HOME}/bin/sqlplus -s user/pwd @${SqlDir}/select_log.sql

split -l 4000 -a 3 ${SqlDir}/EXPORT_ALL.CSV log_20060606_

#mv these splitted file to be csv file 
for file in $(ls ./) 
do 
    echo $file | grep log_20060606_ > /dev/null 
    status=$? 
    if [ $status -eq 0 ]; then 
        mv $file $file.csv 
    fi 
    status=1 
done

80万10分钟就可以搞定了。

ksh可以执行,由于有这句:$(ls ./),sh不支持。

--------------------------------------------------------

谢谢大家!

http://blog.csdn.net/studyvcmfc/article/details/7047986

oracle导出多CSV文件的靠谱的的更多相关文章

  1. java导出生成csv文件

    首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分隔的,对比如下图: txt中显示: 修改文件后缀为csv后显示如下: 在java中我 ...

  2. 淘宝助理导出的csv文件使用的是什么编码,您猜?

    今天下午用Java读取从淘宝助理 V4.3 Beta1导出的csv文件,出现中文乱码情况. 一看就是文件编码引起的,不清楚淘宝助理导出的csv文件使用了什么编码,到百度搜索了一下,看到一些相关文章,但 ...

  3. R: 导入 csv 文件,导出到csv文件,;绘图后导出为图片、pdf等

    ################################################### 问题:导入 csv 文件 如何从csv文件中导入数据,?参数怎么设置?常用参数模板是啥? 解决方 ...

  4. 如何从sql server导出到csv文件

    如何从sql server导出到csv文件,具体代码如下: private static void WriteHeader(SqlDataReader reader, TextWriter outpu ...

  5. Oracle数据库导入csv文件(sqlldr命令行)

    1.说明 Oracle数据库导入csv文件, 当csv文件较小时, 可以使用数据库管理工具, 比如DBevaer导入到数据库, 当csv文件很大时, 可以使用Oracle提供的sqlldr命令行工具, ...

  6. 原创 Datareader 导出为csv文件方法

    DataReader 是游标只读数据, 如果是大数据导出,用Datatable 将耗费巨大内存资源.因为Datatable 其实就是内存中的一个数据表 代码如下 /// <summary> ...

  7. 如何用UltraEdit查看并修改Oracle导出的dump文件的字符集

    如何查询dmp文件的字符集 用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集.如果dmp文件不大,比如只有几M或几十M,可以用Ultr ...

  8. Java列表分页查询结果导出到CSV文件,导入CSV文件并解析

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  9. 导出到CSV文件

    一.手工导出导出 1.winform void DataGridViewToExcel(DataGridView dataGridView1) { SaveFileDialog saveFileDia ...

随机推荐

  1. SpringCloud开发学习总结(七)—— 声明式服务调用Feign(三)

    Feign中的Ribbon配置 由于Spring Cloud Feign的客户端负载均衡是通过Spring Cloud Ribbon实现的,所以我们可以直接通过配置Ribbon客户端的方式来自定义各个 ...

  2. Java开发笔记(九十五)NIO配套的文件工具Files

    NIO不但引进了高效的文件通道,而且新增了更加好用的文件工具家族,包括路径组工具Paths.路径工具Path.文件组工具Files.先看路径组工具Paths,该工具提供了静态方法get,输入某个文件的 ...

  3. 第一次向nodeclub提交修改

    今天第一次向nodeclub提交了两个修改,两个修改都是涉及部分浏览器的兼容性的. Manager很快合并了我的修改,好开森.晚上又重新回炉了一下git的日常操作,将git部分操作整理了一下写于此博. ...

  4. 用户授权policy

    定义策略类 php artisan make:policy PostPolicy app/Policies/PostPolicy.php public function update(User $us ...

  5. 解决selenium.common.exception.WebDriverException:Message:'chromedriver' executable needs to be in Path

    'chromedriver' executable needs to be in Path 声明:本人萌新,刚学python不久记录一下自己的坑,发出来若能帮助到一些人尽早解决问题那便是极好的,( ̄▽ ...

  6. Python3基础教程(十八)—— 测试

    编写测试检验应用程序所有不同的功能.每一个测试集中在一个关注点上验证结果是不是期望的.定期执行测试确保应用程序按预期的工作.当测试覆盖很大的时候,通过运行测试你就有自信确保修改点和新增点不会影响应用程 ...

  7. 吸顶条 ---- jQ写法

    <script> $(function () { var barTop = $('#bar').offset().top; //on方法相当于原生的绑定 $(window).on('scr ...

  8. 第4节 hive调优:2、数据倾斜

    数据的倾斜: 主要就是合理的控制我们的map个数以及reduce个数 第一个问题:maptask的个数怎么定的???与我们文件的block块相关,默认一个block块就是对应一个maptask 第二个 ...

  9. java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map主要用于存储健值对,根 ...

  10. 洛谷p1049 01背包

    dp水之旅背包 题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数). 要求n个物品中,任取若干个装入箱 ...