小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

sqlplus copy(復(fù)制大批量數(shù)據(jù)(long類型))

 guolijiegg 2012-01-14

sqlplus copy(復(fù)制大批量數(shù)據(jù)(long類型))

使用sqlplus Copy 命令從遠(yuǎn)程數(shù)據(jù)庫讀取數(shù)據(jù).
需要從9個(gè)地市的計(jì)費(fèi)數(shù)據(jù)庫中讀取一些表,存儲(chǔ)到運(yùn)營分析系統(tǒng)中.
有幾個(gè)表數(shù)據(jù)量超過1億條.

對(duì)于這么大的數(shù)據(jù)量,如果用create table as select 或者使用cursor的話,對(duì)回滾段的壓力肯定非常大.

經(jīng)過同事提示,想到了sqlplus的copy命令.

connect ods/ods
set time on
set timing on
set head on
set echo on
set copycommit 10
set arraysize 5000

-- 長春
copy from yyfx/******@ccbill1 to changchun/******@ora1 create serv  using select * from lbas.serv;

這個(gè)命令不用太多解釋.
需要注意的是: create處有4中選擇: create,append,insert,replace.
具體命令下面有一個(gè)itput的帖子,解釋得很詳細(xì).

補(bǔ)充點(diǎn): 在sqlplus執(zhí)行這個(gè)命令的時(shí)候,有3個(gè)選項(xiàng)需要注意:
set long 1000          -----------long型字符的長度
set copycommit 10   -----------讀多少次提交
set arraysize 5000     -----------每次讀取數(shù)據(jù)的行數(shù)
根據(jù)以上的設(shè)置,copy命令每次讀取5000行數(shù)據(jù),沒讀取10次(50000行)commit一次.

下面是itpub的文檔:

Copy Command的初步研究

SQL*Plus Copy Command
前言
這段時(shí)間論壇里有好幾個(gè)貼子討論到了在表之間復(fù)制數(shù)據(jù)的問題,也討論到了SQL*Plus Copy Command。
在數(shù)據(jù)表間復(fù)制數(shù)據(jù)是Oracle DBA經(jīng)常面對(duì)的任務(wù)之一,Oracle為這一任務(wù)提供了多種解決方案,SQL*Plus Copy Command便是其中之一。SQL*Plus Copy Command通過SQL*Net在不同的表(同一服務(wù)器或是不同服務(wù)器)之間復(fù)制數(shù)據(jù)或移動(dòng)數(shù)據(jù)。
在實(shí)際運(yùn)行環(huán)境中若能恰當(dāng)?shù)剡x擇使用SQL*Plus Copy Command可以有效地提高數(shù)據(jù)復(fù)制的性能。
下面將簡要介紹SQL*Plus Copy Command使用,并在性能方面與其他兩種方案進(jìn)行對(duì)比,力求能提供一個(gè)使用Copy Command的方案參考。

1.語法及使用說明
1.1 語法
下面我們來看一下SQL*Copy Command的語法及使用說明。
在解釋SQL*Plus Copy Command的語法之前,我們必須要明確SQL*Plus Copy Command不是一個(gè)方法或是函數(shù),也不是一個(gè)SQL語句,它是一個(gè)命令(command),當(dāng)然這個(gè)命令必須在SQL*Plus里運(yùn)行。

SQL*Plus Copy Command的語法:
COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)]
USING query

我們分部分來解釋一下:

COPY – 這個(gè)不太需要解釋,主命令,聲明要執(zhí)行COPY操作

From Database – 源數(shù)據(jù)庫
To Database – 目標(biāo)數(shù)據(jù)庫
此處注意花括號(hào)中有三種可選的寫法(以”|”隔開),如果源數(shù)據(jù)表和目標(biāo)數(shù)據(jù)表在同一個(gè)Schema中,則可以只寫From Database,也可以只寫To Database,當(dāng)然還可以是第三種寫法,把From Database和To Database寫全。但如果源數(shù)據(jù)表和目標(biāo)數(shù)據(jù)表不在同一個(gè)Schema中,則必須用第三種寫法,即把From Database和To Database都寫全
From Database和To Database的格式是一樣的:USERID/PASSWORD@SID,這個(gè)大家都應(yīng)該很熟悉了。

{APPEND|CREATE|INSERT|REPLACE} – 聲明操作數(shù)據(jù)的方式,下面分別解釋一下:
Append – 向已有的目標(biāo)表中追加記錄,如果目標(biāo)表不存在,自動(dòng)創(chuàng)建,這種情況下和Create等效。
Create – 創(chuàng)建目標(biāo)表并且向其中追加記錄,如果目標(biāo)表已經(jīng)存在,則會(huì)返回錯(cuò)誤。
Insert – 向已有的目標(biāo)表中插入記錄,與Append不同的是,如果目標(biāo)表不存在,不自動(dòng)創(chuàng)建而是返回錯(cuò)誤。
Replace – 用查詢出來的數(shù)據(jù)覆蓋已有的目標(biāo)表中的數(shù)據(jù),如果目標(biāo)表不存在,自動(dòng)創(chuàng)建。

destination_table – 目標(biāo)表的名字
[(column, column, column, ...)] – 可以指定目標(biāo)表中列的名字,如果不指定,則自動(dòng)使用Query中的列名。
USING query – 查詢語句,交流的數(shù)據(jù)來自這兒。

1.2 使用范例
下面我們通過幾個(gè)例子來看一下SQL*Plus Copy Command的使用:

1.2.1 在同一個(gè)服務(wù)器的同一個(gè)Schema中復(fù)制數(shù)據(jù):
Copy操作前Schema中的表

SQL> conn scott/tiger
已連接。
SQL> select tname from tab;
TNAME
------------------------------
DEPT
EMP
BONUS
SALGRADE


同時(shí)指定From database和To database

SQL> copy from scott/tiger@lsj to scott/tiger@lsj create dept1 using select * from dept;
數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 DEPT1 已創(chuàng)建。
4 行選自 scott@lsj。
4 行已插入 DEPT1。
4 行已提交至 DEPT1 (位于 scott@lsj)。

只指定From Database

SQL> copy from scott/tiger@lsj create dept2 using select * from dept;
數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 DEPT2 已創(chuàng)建。

4 行選自 scott@lsj。
4 行已插入 DEPT2。
4 行已提交至 DEPT2 (位于 DEFAULT HOST 連接)。

只指定To Database

SQL> copy to scott/tiger@lsj create dept3 using select * from dept;
數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 DEPT3 已創(chuàng)建。

4 行選自 DEFAULT HOST 連接。
4 行已插入 DEPT3。
4 行已提交至 DEPT3 (位于 scott@lsj)。

Copy操作后Schema中的表

SQL> select tname from tab;
TNAME
------------------------------
DEPT
EMP
BONUS
SALGRADE
DEPT1
DEPT2
DEPT3

已選擇7行。


1.2.2 在同一個(gè)服務(wù)器的不同Schema中復(fù)制數(shù)據(jù):
這種情況下必須同時(shí)指定From Database和To Database

SQL> copy from scott/tiger@lsj to lsjdemo/lsjdemo@lsj create dept using select * from dept;

數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 DEPT 已創(chuàng)建。

4 行選自 scott@lsj。
4 行已插入 DEPT。
4 行已提交至 DEPT (位于 lsjdemo@lsj)。


注意這種情況下,using select * from dept 中并不需要使用scott.demp的形式。

1.2.3 在不同的服務(wù)器間復(fù)制數(shù)據(jù):

SQL> conn lsj/lsj@sunserve
已連接。
SQL> copy from scott/tiger@lsj to lsj/lsj@sunserve create dept using select * from dept;

數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 DEPT 已創(chuàng)建。

4 行選自 scott@lsj。
4 行已插入 DEPT。
4 行已提交至 DEPT (位于 lsj@sunserve)。

2.SQL*Plus Copy Command的性能

對(duì)于SQL*Plus Copy Command的性能問題可謂是眾說紛紜,有人說SQL*Plus Copy Command復(fù)制數(shù)據(jù)時(shí)不經(jīng)過Buffer,不寫回滾段,所以速度是非??斓?;而有人經(jīng)過實(shí)驗(yàn)發(fā)現(xiàn)SQL*Plus Copy Command并不像想象中的那么快,甚至慢得讓人難以接受。

我們說SQL*Plus Copy Command快還是慢主要是與其他兩種復(fù)制數(shù)據(jù)的方案進(jìn)行對(duì)比:
Create table … as select …
Insert into … select … from …

這三種方案在性能上到底有什么差別呢,我們通過實(shí)驗(yàn)來驗(yàn)證一下。

實(shí)驗(yàn)環(huán)境:
我的工作用機(jī),lsj
CPU:2.6G
MEM:1G
Oracle:10g

實(shí)驗(yàn)方案描述:

構(gòu)造一個(gè)500余萬條記錄的實(shí)驗(yàn)表,分別用三種方案復(fù)制到新的表統(tǒng)計(jì)所花的時(shí)間,Create…as..和Insert …. select…直接使用Sql*Plus的時(shí)間統(tǒng)計(jì),Copy命令不能使用Sql*Plus的時(shí)間統(tǒng)計(jì),采用秒表計(jì)時(shí),可精確到百分之一秒。

實(shí)驗(yàn)前后監(jiān)控UNDOTBS來查看寫回滾段的數(shù)據(jù)量,數(shù)據(jù)庫運(yùn)行在Archivelog狀態(tài)下,查看Archivelog來監(jiān)控寫Redo的數(shù)據(jù)量(這個(gè)可能不太精確,誰有更好的方法請(qǐng)指教一下)。

2.1 準(zhǔn)備實(shí)驗(yàn)數(shù)據(jù)

SQL> conn lsjdemo/lsjdemo@lsj
已連接。
SQL> select count(*) from all_objects;

COUNT(*)
----------
10164

SQL> create table a as select * from all_objects where 1<0;

表已創(chuàng)建。

SQL> declare n number;
2 begin
3 for n in 1..500 loop
4 insert into a select * from all_objects;
5 end loop;
6 end;
7 /

PL/SQL 過程已成功完成。

SQL> select count(*) from a;

COUNT(*)
----------
5082500


看一下500多萬條記錄占了多大空間

SQL> select SUM(BYTES)/(1024*1024) Total_Space from DBA_extents
2 where owner='LSJDEMO' and segment_type='TABLE' and segment_name='A'
3 GROUP BY TABLESPACE_NAME,SEGMENT_NAME;

TOTAL_SPACE
-----------
504


2.2 實(shí)驗(yàn)過程
2.2.1 Copy Command

首先來看一下SQL*Plus Copy Command的表現(xiàn)。

操作前的狀態(tài):

SQL> column 表空間名 format a15

SQL> select a.file_id "文件號(hào)",a.tablespace_name "表空間名",
a.bytes/(1024*1024) "空間(M)",
(a.bytes-sum(nvl(b.bytes,0)))/(1024*1024) "已用(M)",
(sum(nvl(b.bytes,0)))/(1024*1024) "剩余空間(M)",
sum(nvl(b.bytes,0))/a.bytes*100 "可用比率"
from dba_data_files a, dba_free_space b
where a.file_id=b.file_id(+) and a.tablespace_name='UNDOTBS1'
group by a.tablespace_name ,a.file_id,a.bytes;

文件號(hào) 表空間名 空間(M) 已用(M) 剩余空間(M) 可用比率
---------- --------------- ---------- ---------- ----------- ----------
2 UNDOTBS1 3000 1032.625 1967.375 65.5791667


執(zhí)行過程:

SQL> copy from lsjdemo/lsjdemo@lsj create b using select * from a;

數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 B 已創(chuàng)建。

5083000 行選自 lsjdemo@lsj。
5083000 行已插入 B。
5083000 行已提交至 B (位于 DEFAULT HOST 連接)。


再次查看回滾段表空間狀態(tài):

SQL> /

文件號(hào) 表空間名 空間(M) 已用(M) 剩余空間(M) 可用比率
---------- --------------- ---------- ---------- ----------- ----------
2 UNDOTBS1 3000 1032.625 1967.375 65.5791667



上面的結(jié)果說明copy command沒有生成undo。

經(jīng)查看發(fā)現(xiàn)生成了592M的歸檔日志,說明copy comm.and生成了大量的redo數(shù)據(jù)。


執(zhí)行時(shí)間:8分40.51秒 = 520.51秒





2.2.2 Insert into …. select ….
接下來我們看一下Insert 的性能,在執(zhí)行Insert前將歸檔日志清空:

SQL> set timing on
SQL> create table c as select * from a where 1<0;

表已創(chuàng)建。

已用時(shí)間: 00: 00: 00.45
SQL> insert into c select * from a;

已創(chuàng)建5083000行。

已用時(shí)間: 00: 10: 31.64

再次查看回滾段表空間狀態(tài):

SQL> /

文件號(hào) 表空間名 空間(M) 已用(M) 剩余空間(M) 可用比率
---------- --------------- ---------- ---------- ----------- ----------
2 UNDOTBS1 3000 1032.625 1967.375 65.5791667


咦,回滾段表空間依然是1032.625M,難道Insert不生成undo信息?不可能啊。

偶再次執(zhí)行insert into c select * from a; 并啟動(dòng)一個(gè)監(jiān)控程序,每5秒報(bào)告UNDOTBS1的空間信息,這才發(fā)現(xiàn)了問題所在.

原來在開始執(zhí)行Insert的時(shí)候回滾段表空間被釋放了一部分,釋放到687.625M,然后在Insert的過程中逐漸增長,最后又增長到1032.625M,說明Insert生成了1032.625-687.625=345M回滾信息。

回滾段表空間為什么會(huì)先釋放后增長呢,它里面明明有足夠的Free空間呀,這個(gè)偶也想不明白了。

同樣,偶也想到,Copy Command會(huì)不會(huì)也是這種情況呢

所以,偶再次執(zhí)行Copy,也同樣地監(jiān)控回滾段表空間,發(fā)現(xiàn)在執(zhí)行過程中回滾段表空間始終是1032.625M,最終證明了Copy command沒有生成Undo信息。

接下來查看歸檔日志,發(fā)現(xiàn)Insert生成了1.72G的歸檔日志,歸檔日志的數(shù)據(jù)量是Copy Command的三倍之多。

執(zhí)行時(shí)間從上面的結(jié)果已經(jīng)可以看到了:

已用時(shí)間: 00: 10: 31.64

10分31.64秒 = 631.64秒。

2.2.3 Create … as select…
最后來看看Create的性能。


SQL> create table d as select * from a;

表已創(chuàng)建。

已用時(shí)間: 00: 04: 04.79


在執(zhí)行過程中監(jiān)控Undo表空間,發(fā)現(xiàn)也沒有生成回滾信息。其實(shí)Create不生成回滾是很好理解的,因?yàn)镃reate Table 是DDL語句,根本無法回滾,自然也就不會(huì)生成回滾信息了。

經(jīng)查看發(fā)現(xiàn)生成了515M歸檔日志,比Insert少得多,比Copy Command也少一些。

執(zhí)行時(shí)間上快得有些出乎意料:
4分4.79秒 = 244.79秒,明顯快于前兩種方案。

在這里偶對(duì)Create的執(zhí)行機(jī)制產(chǎn)生了一個(gè)猜測,認(rèn)為它并不是把數(shù)據(jù)先Query出來,再用Query的結(jié)果寫入目標(biāo)表中,而是直接讀Block數(shù)據(jù)并寫入目標(biāo)表中,所以才會(huì)有這么快的執(zhí)行速度。
下面來驗(yàn)證一下:


SQL> create view v_a as select * from a;
視圖已創(chuàng)建。
已用時(shí)間: 00: 00: 00.14
SQL> create table e as select * from v_a;
表已創(chuàng)建。
已用時(shí)間: 00: 04: 03.62


從上面的結(jié)果看出還是很快,難道是這個(gè)視圖太特殊了,再試一個(gè):


SQL> drop view v_a;

視圖已刪除。
SQL> desc a;
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(30)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(19)
CREATED DATE
LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)

SQL> create view v_a as select owner,object_name,subobject_name,
rownum rno,data_object_id,object_type,created,
last_ddl_time,timestamp,status,temporary,generated,secondary
from a;
視圖已創(chuàng)建。
已用時(shí)間: 00: 00: 00.03
SQL> create table e as select * from v_a;
表已創(chuàng)建。
已用時(shí)間: 00: 04: 12.65


這個(gè)結(jié)果依然是很快,看來偶的猜測是完全錯(cuò)誤的,那Create table ….as select 為什么會(huì)這么快呢?偶是想不明白了,敬請(qǐng)諸位老大指教一下。

2.2.4 實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)數(shù)據(jù):
記錄數(shù):5,082,500
數(shù)據(jù)量:504M
實(shí)驗(yàn)結(jié)果

方案------------------------執(zhí)行時(shí)間(秒) ---------Undo(M) ------Redo(M)
Copy command -------------520.51----------------------0 ---------------- 592
Insert into…select …---- 631.64 ------------------345 -------------1720
Create Table…------------- 244.79 --------------------0 ----------------515

2.2.5 實(shí)驗(yàn)總結(jié)

Create Table…as select…是最快的,而且生成的Undo和Redo信息最少,所以只要可能,請(qǐng)盡量使用這種方案。但這種方案有一定的限制,即目標(biāo)表必須是不存在的,不能用它向已有的目標(biāo)表中追加記錄。

Insert into … select … 是最慢的,而且生成最多的Undo和Redo信息,對(duì)I/O的壓力最大,優(yōu)勢在于大家對(duì)它比較熟悉,使用起來比較簡單,適合于處理少量的數(shù)據(jù),若要處理大量的數(shù)據(jù),不推薦使用這種方案。

Copy Command可以處理Create Table不能處理的情況,即向已有的數(shù)據(jù)表中追加記錄,相對(duì)于insert來說,效率更高一些,生成更少的Redo信息,不生成Undo信息,所以在執(zhí)行大量的數(shù)據(jù)追加時(shí),推薦使用Copy Command命令。

2.3 對(duì)Copy Command的進(jìn)一步實(shí)驗(yàn)

我們在觀察Copy Command的結(jié)果的時(shí)候發(fā)現(xiàn)輸出中有幾個(gè)引人注意的信息:

SQL> copy from lsjdemo/lsjdemo@lsj create b using select * from a;

數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 B 已創(chuàng)建。

5083000 行選自 lsjdemo@lsj。
5083000 行已插入 B。
5083000 行已提交至 B (位于 DEFAULT HOST 連接)。


其中:
數(shù)組提取/綁定大小為 15。(數(shù)組大小為 15)
這個(gè)和SQL Plus的一個(gè)選項(xiàng)有關(guān) -- Arraysize


SQL> show arraysize
arraysize 15


這個(gè)選項(xiàng)決定在Copy操作時(shí)以15條記錄為一個(gè)批處理,在這兒偶又猜測,如果把這個(gè)值設(shè)大一些,Copy 是否會(huì)快一些呢?
實(shí)驗(yàn)一把:


SQL> set arraysize 2048
SQL> show arraysize
arraysize 2048
SQL> copy from lsjdemo/lsjdemo@lsj create f using select * from a;
數(shù)組提取/綁定大小為 2048。(數(shù)組大小為 2048)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 F 已創(chuàng)建。

5083000 行選自 lsjdemo@lsj。
5083000 行已插入 F。
5083000 行已提交至 F (位于 DEFAULT HOST 連接)。


哈哈,果然不出偶所料(終于料準(zhǔn)了一把 ):
執(zhí)行時(shí)間:4分35.37秒 = 275.37秒,這個(gè)結(jié)果已經(jīng)和Create table … 相差不多了

最新實(shí)驗(yàn)結(jié)果

方案---------------------執(zhí)行時(shí)間(秒)---------------Undo(M)-------------Redo(M)
Copy command------------275.37---------------------0-------------------------592
Insert into…----------------631.64------------------345---------------------1720
Create Table… -----------244.79---------------------0----------------------515


偶繼續(xù)猜想,偶把Arraysize從15改成2048,結(jié)果快了很多,那改得再大一些,應(yīng)該會(huì)更快的,偶把它改成最大值5000,繼續(xù)實(shí)驗(yàn):

SQL> set arraysize 5000
SQL> show arraysize
arraysize 5000

SQL> copy from lsjdemo/lsjdemo@lsj create g using select * from a;
數(shù)組提取/綁定大小為 5000。(數(shù)組大小為 5000)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
表 G 已創(chuàng)建。

5083000 行選自 lsjdemo@lsj。
5083000 行已插入 G。
5083000 行已提交至 G (位于 DEFAULT HOST 連接)。


呵呵,偶又料準(zhǔn)了一把:
執(zhí)行時(shí)間:4分22.97秒 = 262.97秒


最新實(shí)驗(yàn)結(jié)果

方案---------------------執(zhí)行時(shí)間(秒)---------------Undo(M)-------------Redo(M)
Copy command------------262.97---------------------0-------------------------592
Insert into…----------------631.64------------------345---------------------1720
Create Table… -----------244.79---------------------0----------------------515



進(jìn)一步實(shí)驗(yàn)后的結(jié)論:
Copy comm.and的執(zhí)行速度受Arryasize的影響,一般來說,把Arraysize設(shè)置得大一些Copy command會(huì)執(zhí)行得更快,Arraysize的最大值是5000。

3.Copy Command的一些其他說明

3.1 數(shù)據(jù)類型方面的限制

Copy Command只支持如下幾種類型的字段:

CHAR
DATE
LONG
NUMBER
VARCHAR2


如果Query中包含這些字段之外的字段,則Copy Command無法執(zhí)行,返回錯(cuò)誤:

SQL> create table m(a number,b blob default empty_blob());
表已創(chuàng)建。
已用時(shí)間: 00: 00: 00.07
SQL> insert into m values(1,empty_blob());
已創(chuàng)建 1 行。
已用時(shí)間: 00: 00: 00.00
SQL> commit;
提交完成。
已用時(shí)間: 00: 00: 00.00
SQL> copy from lsjdemo/lsjdemo@lsj create n using select * from m;
數(shù)組提取/綁定大小為 5000。(數(shù)組大小為 5000)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
CPY-0012: 無法復(fù)制數(shù)據(jù)類型


3.2 對(duì)LONG系列類型字段的支持

與2.4.1中所論述的相反,Copy Command支持Long 及Long Raw類型的字段,但I(xiàn)nsert into…select …及Create Table …. as select …則不支持Long及Long Raw 類型的字段。這種情況下,Copy Command反而可以很好地完成任務(wù)。

SQL> create table o(a number,b long raw);
表已創(chuàng)建。
已用時(shí)間: 00: 00: 00.04
SQL> insert into o values(1,NULL);
已創(chuàng)建 1 行。
已用時(shí)間: 00: 00: 00.00
SQL> create table p as select * from o;
create table p as select * from o
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00997: 非法使用 LONG 數(shù)據(jù)類型

已用時(shí)間: 00: 00: 00.00
SQL> create table p(a number, b long raw);
表已創(chuàng)建。
已用時(shí)間: 00: 00: 00.00
SQL> insert into p select * from o;
insert into p select * from o
*
第 1 行出現(xiàn)錯(cuò)誤:
ORA-00997: 非法使用 LONG 數(shù)據(jù)類型

已用時(shí)間: 00: 00: 00.01
SQL> copy from lsjdemo/lsjdemo@lsj append p using select * from o;
數(shù)組提取/綁定大小為 5000。(數(shù)組大小為 5000)
將在完成時(shí)提交。(提交的副本為 0)
最大 long 大小為 80。(long 為 80)
1 行選自 lsjdemo@lsj。
1 行已插入 P。
1 行已提交至 P (位于 DEFAULT HOST 連接)。



3.3 選擇執(zhí)行Host

選擇執(zhí)行Copy command的Host時(shí)需要十分注意,如果目標(biāo)Schema和源Schema在同一臺(tái)服務(wù)器上,由執(zhí)行的Host最好也放在這臺(tái)服務(wù)器上,也即在這臺(tái)服務(wù)器上執(zhí)行Copy Command,如果目標(biāo)Schema和源Schema不在同一臺(tái)服務(wù)器上,則可以在目標(biāo)服務(wù)器上執(zhí)行Copy Command,也可以在源服務(wù)器上執(zhí)行Copy Command,但不要在第三臺(tái)機(jī)器上執(zhí)行Copy Command。

總之,不要在和Copy Command操作的數(shù)據(jù)無關(guān)的客戶端上執(zhí)行Copy Command。

原因比較好理解,Copy Command的執(zhí)行機(jī)制是通過SQL*Net來周轉(zhuǎn)數(shù)據(jù),如果是在第三臺(tái)機(jī)器上執(zhí)行的話,相當(dāng)于數(shù)據(jù)繞了一大段彎路才進(jìn)入目標(biāo)服務(wù)器,自然會(huì)影響效率。

4.總結(jié)

最終實(shí)驗(yàn)結(jié)果

方案---------------------執(zhí)行時(shí)間(秒)---------------Undo(M)-------------Redo(M)
Copy command------------262.97--------------------0-------------------------592
Insert into…----------------631.64------------------345---------------------1720
Create Table… -----------244.79---------------------0----------------------515


相信您可以參考這個(gè)結(jié)果得出什么情況下可以使用Copy Command的結(jié)論。

總體來說,SQL*Plus Copy Command是一個(gè)很不錯(cuò)的東東,其實(shí)Oracle為我們的每一項(xiàng)可能面臨的工作任務(wù)都提供了多種可以選擇的實(shí)現(xiàn)方案,關(guān)鍵在于我們要了解這些方案,并且知道在什么情況下選擇哪種方案更加合適。

偶研究Oracle的時(shí)間不長,經(jīng)驗(yàn)很不足的說,上面的研究過程肯定有不少不足和錯(cuò)誤,敬請(qǐng)各位拍磚指正

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多