黄色电影一区二区,韩国少妇自慰A片免费看,精品人妻少妇一级毛片免费蜜桃AV按摩师 ,超碰 香蕉

Oracle導出文本文件的三種方法(spool,UTL_FILE,sqluldr2)

oracle導出文本文件的三種方法(spool,utl_file,sqluldr2)

一、常見的spool方法

二、utl_file包方法

三、sqluldr2工具

為了構建導出文本文件,先做點準備工作

1、擴充表空間

alter tablespace dams_data 
add datafile 'c:\oracle\oradata\orcl\damadata2.dbf' 
size 500m autoextend on maxsize 6000m; 

2、創(chuàng)建一張10萬記錄和50萬記錄的數(shù)據(jù)表

首先為了快速創(chuàng)建表數(shù)據(jù)用了connect by方法,再次為了把表存儲搞大,每個字段長度都是1000字節(jié),一條記錄平均4000字節(jié)左右,數(shù)據(jù)庫的db_block_size=8192字節(jié),由于block還包括其他信息,所以一個塊只能存儲一條記錄,10萬記錄大概在800m左右,50萬記錄為4g

create table record10w
(
      id      int,
      data1   char(1000),
      data2   char(1000),
      data3   char(1000),
      data4   char(1000)
);
insert into record10w
select a.rn,
     dbms_random.string ('u', 5), --大寫字母隨機
     dbms_random.string ('l', 5), --小寫字母隨機
     dbms_random.string ('a', 5), --混合字母隨機
     dbms_random.string ('x', 5)  --字符串數(shù)字隨機
   --dbms_random.string ('p', 5) --鍵盤字符隨機
from (select level,rownum rn 
        from dual
     connect by rownum<=100000) a;
--27 seconds       
commit;     
create table record50w
(
      id      int,
      data1   char(1000),
      data2   char(1000),
      data3   char(1000),
      data4   char(1000)
);
insert into record50w
select a.rn,
     dbms_random.string ('u', 5), --大寫字母隨機
     dbms_random.string ('l', 5), --小寫字母隨機
     dbms_random.string ('a', 5), --混合字母隨機
     dbms_random.string ('x', 5)  --字符串數(shù)字隨機
   --dbms_random.string ('p', 5) --鍵盤字符隨機
from (select level,rownum rn 
        from dual
     connect by rownum<=500000) a;
--164 seconds       
commit; 

3、簡單做一下表分析

analyze table record10w compute statistics;  
analyze table record50w compute statistics;  

4、查看一下表的統(tǒng)計信息

select a.owner,a.table_name,a.tablespace_name,a.num_rows,a.blocks,a.empty_blocks,a.avg_row_len
from all_tables a 
where owner='metadata' 
 and table_name in ('record10w','record50w') 

 

方法一,spool方法

定義spool10w.sql用來導出record10w記錄

@c:\software\sqluldr2\spool10w.sql

spool c:\software\sqluldr2\data\record10wspool.txt 
set echo off  --不顯示腳本中正在執(zhí)行的sql語句
set feedback off --不顯示sql查詢或修改行數(shù)
set term off   --不在屏幕上顯示
set heading off  --不顯示列
set linesize 1000; //設置行寬,根據(jù)需要設置,默認100
select id||','||data1|| ',' ||data2 from record10w;  --需要導出的數(shù)據(jù)查詢sql
spool off

定義spool50w.sql用來導出record50w記錄

@c:\software\sqluldr2\spool50w.sql

spool c:\software\sqluldr2\data\record10wspool.txt 
set echo off  --不顯示腳本中正在執(zhí)行的sql語句
set feedback off --不顯示sql查詢或修改行數(shù)
set term off   --不在屏幕上顯示
set heading off  --不顯示列
set linesize 1000; //設置行寬,根據(jù)需要設置,默認100
select id||','||data1|| ',' ||data2 from record50w;  --需要導出的數(shù)據(jù)查詢sql
spool off

在oracle command窗口中執(zhí)行命令

sql> set time on;
18:09:32 sql> @c:\software\sqluldr2\spool10w.sql
started spooling to c:\software\sqluldr2\data\record10wspool.txt
--20秒
18:09:51 sql> @c:\software\sqluldr2\spool50w.sql
18:10:52 sql> 
--1分1秒

補充

sqlplus / as sysdba

set linesize 1000
set pagesize 0
set echo off
set termout off
set heading off
set feedback off
set trims on
set term off
set trimspool on
set trimout on
spool '/archlog/exp/test.txt';
select owner||' , '||segment_name||' , '||partition_name||' , ' from dba_segments where rownum<10000;
spool off;
/

 

方法二、utl_file包

這個包很久之前用過,好像效率也不錯,在此不想嘗試了,有興趣的朋友可以試一下性能。

utl_file.fopen打開文件

utl_file.put_line寫入記錄

utl_file.fclose關閉文件

utl_file.fopen第一個參數(shù)為文件路徑,不能直接指定絕對路徑,需要建立directory,然后指定我們建立的directory

sqlplus / as sysdba
create directory my_dir as ‘/home/oracle/’;
grant read,write on directory dir_dump to hr;##也可以直接建立一個public directory

create or replace procedure test
is
testjiao_handle utl_file.file_type;
begin
test_handle := utl_file.fopen('my_dir','test.txt','w');
  for x in (select * from testjiao) loop
    utl_file.put_line(test_handle,x.id || ',' || x.rq ||',');
  end loop;
    utl_file.fclose(test_handle);
exception when others then
dbms_output.put_line(substr(sqlerrm,1,2000));
end;
/

 

方法三、sqluldr2

說實在的oracle對大批量大規(guī)模數(shù)據(jù)的導出做的很不友好,大概是基于某種自信吧,spool的效率一般很低,很多開源etl工具都是通過jdbc連接導出的,效率也好不到那里去

sqluldr2的作者是樓方鑫,oracle的大牛,原來淘寶的大神,有過幾面之緣,是基于oci底層接口開發(fā)的文本導出工具。

sqluldr2小巧方便,使用方法類似于oracle自帶的exp,支持自定義sql、本地和客戶端的導出,速度快,效率高。

sqluldr2有幾個版本,面向linux和windows的,有32位和64位的,可自行找鏈接下載。

c:\software\sqluldr2>sqluldr264
sql*unloader: fast oracle text unloader (gzip, parallel), release 4.0.1
(@) copyright lou fangxin (anysql.net) 2004 - 2010, all rights reserved.
license: free for non-commercial useage, else 100 usd per server.
usage: sqluldr2 keyword=value [,keyword=value,...]
valid keywords:
 user    = username/password@tnsname  #連接用戶/密碼@tns名稱
 sql     = sql file name      #指定sql文件名
 query   = select statement #指定sql語句
 field   = separator string between fields    #指定字段分隔符
 record  = separator string between records   #指定記錄換行符
 rows    = print progress for every given rows (default, 1000000)     #輸出導出記錄日志
 file    = output file name(default: uldrdata.txt)    #導出數(shù)據(jù)文件名
 log     = log file name, prefix with + to append mode        #導出日志文件名
 fast    = auto tuning the session level parameters(yes)      #快速導出參數(shù)
 text    = output type (mysql, csv, mysqlins, oracleins, form, search).       #導出類型
 charset = character set name of the target database. #設置目標數(shù)據(jù)庫字符集
 ncharset= national character set name of the target database.        
 parfile = read command option from parameter file    
for field and record, you can use '0x' to specify hex character code,
\r=0x0d \n=0x0a |=0x7c ,=0x2c, \t=0x09, :=0x3a, #=0x23, "=0x22 '=0x27

#設置查詢條件為select * from record50w,導出文件頭,導出文件名為record50wsqluldr2.csv,日志文件名為record50wsqluldr2.log,控制文件名為record50w_sqlldr.ctl

sqluldr264 metadata/xxxxxx@127.0.0.1:1521/orcl query="select id,data1,data2 from record50w" head=yes file=c:\software\sqluldr2\data\record50wsqluldr2.csv log=c:\software\sqluldr2\log\record50wsqluldr2.log table=record50w

sqluldr264 metadata/xxxxxx@127.0.0.1:1521/orcl query="select id,data1,data2 from record10w" head=yes file=c:\software\sqluldr2\data\record10wsqluldr2.csv log=c:\software\sqluldr2\log\record10wsqluldr2.log table=record10w

具體執(zhí)行見下面:

c:\software\sqluldr2>time
當前時間: 18:14:07.92
c:\software\sqluldr2>sqluldr264 metadata/xxxxxx@127.0.0.1:1521/orcl query="select id,data1,data2 from record50w" head=yes file=c:\software\sqluldr2\data\record50wsqluldr2.csv log=c:\software\sqluldr2\log\record50wsqluldr2.log table=record50w
c:\software\sqluldr2>time
當前時間: 18:14:26.40 
--19秒

c:\software\sqluldr2>time
當前時間: 18:14:36.83
c:\software\sqluldr2>sqluldr264 metadata/xxxxxx@127.0.0.1:1521/orcl query="select id,data1,data2 from record10w" head=yes file=c:\software\sqluldr2\data\record10wsqluldr2.csv log=c:\software\sqluldr2\log\record10wsqluldr2.log table=record10w
c:\software\sqluldr2>time
當前時間: 18:14:43.05
--7秒

總結:

總的來說,spool比較簡單,但效率比較低

sqluldr2是基于oci接口開發(fā)的,性能上最快

utl_file,是oracle自帶的包,可以測試一下

下一節(jié):oracle丟失temp表空間的處理方法

oracle數(shù)據(jù)庫

相關文章
學習SQLite