(轉)oracle資料庫之間 表複製方法一(extent 方法)
一般我們採用複製表的方式主要是
create table table_name
as select /*+ parallel (t 10)*/ * from t_name t ...
insert /*+ append */ into table_name
select /*+ parallel (t 10)*/ * from tname t ...
這兩者方法都沒有問題,但如果資料量到達一定程度,比如說10億,大小400G,而且表上還存在業務,這樣的話,很容易出現01555的問題。 我在執行了3個小時後遇到了惱人的01555,將undo_retention改到一個足夠大的值還是不行,畢竟表太大,而且表上有業務在更新資料。
有一種方式可以避免01555,可以從物理備庫恢復到某個時刻後,從備庫表拖資料,這樣上面的問題是沒有了,不過有一點是需要考慮的,透過單dblink的話是有網路流量限制的,一般是20M/S,這樣400G的表需要7個小時,還是太慢了。
最終考慮採用extent的方式,一塊一塊的拖,在我預想這樣的速度應該會比直接在主庫複製一個新表要慢一下的。
事實勝於雄辯,採用extent的方式,開12個程式,花了2個半小時完成了整個表的複製。不開12個並行直接複製錶快了30%,而且採用extnt的方式比較靈活,可以在很多情況下繼續上次為完成的工作,就是所謂的斷點了,當然這種方式也是有一定代價的,負載會比前面的方法至少高一倍以上
------------------------------------------------------------
create table MY_ROWID
(
ID NUMBER,
ROWID_MIN VARCHAR2(100),
ROWID_MAX VARCHAR2(100),
HAS_DEAL NUMBER
);
insert into my_rowid(id,rowid_min,rowid_max,has_deal)
select rownum,
DBMS_ROWID.ROWID_CREATE(1,o.data_object_id,e.RELATIVE_FNO,e.BLOCK_ID,0),
DBMS_ROWID.ROWID_CREATE(1,o.data_object_id,e.RELATIVE_FNO,e.BLOCK_ID+e.BLOCKS-1,10000),
0
from dba_extents e,dba_objects o
where e.segment_name=upper('base_table')
and e.owner='FBADMIN'
AND o.object_name = upper('base_table')
AND o.owner='FBADMIN';
commit;
----------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE SP_XF_COPY_TABLE(N NUMBER) IS
/*
複製評價表
2009-8-26
*/
V_SQLERRM VARCHAR2(200);
BEGIN
FOR C IN (SELECT ID, ROWID_MIN, ROWID_MAX
FROM MY_ROWID
WHERE HAS_DEAL = 0
AND MOD(ID, 12) = N) LOOP
INSERT INTO
SELECT /*+ rowid(t) */
*
FROM base_table t
WHERE ROWID >= CHARTOROWID(C.ROWID_MIN)
AND ROWID <= CHARTOROWID(C.ROWID_MAX);
UPDATE MY_ROWID SET HAS_DEAL = 1 WHERE ID = C.ID;
COMMIT;
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
V_SQLERRM := SUBSTR(SQLERRM, 1, 200);
DBMS_OUTPUT.PUT_LINE(V_SQLERRM);
ROLLBACK;
END SP_XF_COPY_TABLE;
---------
儘量使用後臺跑指令碼
nohup $HOME/worksh/sp_xf_tmp00.sh >/tmp/sp_xf_tmp00.txt &
--check data
SELECT COUNT(*) from my_rowid t WHERE has_deal = 0;
~~~~~~~~~~~~~~~~~~~~~
很多情況下可以使用extent來處理大表的資料
--EOF--
insert /*+APPEND */into mytable(select 列名,列名,...... from i_mytable);這樣估計要快很多
如果需要更快
需要用PLSQL
declare
i number(10);
begin
insert /*+APPEND */into mytable(select 列名,列名,...... from i_mytable);
i:=sql%rowcount;
if i%1000=0 then
commit;
end if;
end;
強制批次插入 並且 不要在大表使用*函式 是SQL最佳化的關鍵
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12272958/viewspace-696260/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- (轉)oracle資料庫之間 表複製方法二(物化檢視 方法)Oracle資料庫
- DB2資料庫與Oracle資料庫之間遠端複製(轉)DB2資料庫Oracle
- Oracle 之 Duplicate 複製資料庫Oracle資料庫
- SqlServer同例項複製資料庫方法SQLServer資料庫
- 複製的SQL Server 7資料庫的恢復方法 (轉)SQLServer資料庫
- 克隆資料庫之RMAN複製(一)資料庫
- mysql 複製表資料,表結構的3種方法MySql
- 用最簡單的方法複製或遷移Oracle資料庫Oracle資料庫
- sql2005 表與表之間資料複製SQL
- GoldenGate異種資料庫之間的複製Go資料庫
- Oracle活動資料庫複製Oracle資料庫
- oracle rman複製資料庫Oracle資料庫
- mysql資料庫資料同步/主從複製的配置方法MySql資料庫
- DM7資料複製之資料庫級複製資料庫
- Oracle資料庫中分割槽表的操作方法(轉)Oracle資料庫
- 資料庫複製(一)–複製介紹資料庫
- 【效能優化】Oracle 10g 資料庫之間複製統計資訊優化Oracle 10g資料庫
- 【SQL 資料庫】將一張資料表資訊複製到另一張資料表SQL資料庫
- 在Oracle中實現資料庫的複製(轉)Oracle資料庫
- oracle實驗-資料庫複製Oracle資料庫
- mysql資料庫的備份以及表格資料之間的複製MySql資料庫
- RMAN複製資料庫(一)資料庫
- 【轉載】如何在Oracle中複製表結構和表資料Oracle
- oracle表機構和資料複製Oracle
- SqlServer將資料庫中的表複製到另一個資料庫SQLServer資料庫
- 【SqlServer】【Oracle】sql複製表定義及複製資料行SQLServerOracle
- 在不同字符集的資料庫之間匯入資料的方法(轉)資料庫
- 克隆資料庫之使用者管理複製(一)資料庫
- 克隆資料庫之RMAN複製(二)資料庫
- 資料庫複製資料庫
- 複製資料庫資料庫
- 異構資料庫間批量表快速複製資料庫
- oracle清除資料庫表空間Oracle資料庫
- MySQL複製資料表MySql
- Oracle資料庫中分割槽表的操作方法Oracle資料庫
- Oracle兩表之間資料更新Oracle
- sql取兩個值之間的資料方法(轉)SQL
- 同一資料間複製使用者