MOVE和CTAS比較


聯繫:手機(13429648788) QQ(107644445)QQ諮詢惜分飛

標題:MOVE和CAST比較

作者:惜分飛©版權所有[未經本人同意,請不得以任何形式轉載,否則有進一步追究法律責任的權利.]


1.創建模擬表

SQL> select * from v$version;
 
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
 
SQL> create table chf.t_xifenfei_move
  as
  select * from dba_objects;
 
Table created.
 
SQL> select count(*) from chf.t_xifenfei_move;
 
  COUNT(*)
----------
     73585
 
SQL> create table chf.t_xifenfei_move
  as
  select * from dba_objects;
 
Table created.
 
SQL> select count(*) from chf.t_xifenfei_move;
 
  COUNT(*)
----------
     73585
 
SQL> DECLARE
  2     i NUMBER;
  3      BEGIN
  4        FOR i IN 1..100 LOOP
  5          INSERT INTO chf.t_xifenfei_move
  6          select * from dba_objects;
  7          END LOOP;
  8          COMMIT;
  9      END;
 10      /
 
PL/SQL procedure successfully completed.
 
SQL> exec dbms_stats.gather_table_stats('CHF','T_XIFENFEI_MOVE');
 
PL/SQL procedure successfully completed.
 
SQL> select bytes from dba_segments where segment_name='T_XIFENFEI_MOVE';
 
     BYTES
----------
 872415232

2.測試move
2.1)執行move操作,記錄時間

SQL> alter system flush buffer_cache;
 
System altered.
 
SQL> SET TIMING ON;  
SQL> alter session set events
  '10046 trace name context forever,level 1';
 
Session altered.
 
Elapsed: 00:00:00.00
SQL> ALTER TABLE CHF.T_XIFENFEI_MOVE MOVE TABLESPACE USERS;
 
Table altered.
 
Elapsed: 00:02:11.77
SQL> alter session set events
  '10046 trace name context off';
 
Session altered.
 
Elapsed: 00:00:00.04
SQL> select d.value||'/'||lower(rtrim(i.instance,chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name from
  2  (select p.spid from v$mystat m, v$session s,v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr ) p,
  3  (select t.instance from v$thread t,v$parameter v where v.name = 'thread' and(v.value = 0 or t.thread# = to_number(v.value))) i,
  4  (select value from v$parameter where name = 'user_dump_dest') d;
 
TRACE_FILE_NAME
--------------------------------------------------------------------------------
/opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_4765.trc

從這裏可以看出,move操作執行了00:02:11.77

2.2)查看trace內容

[oracle@node1 ~]$ tkprof  /opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_4765.trc /tmp/xifenfei_move.txt
 
TKPROF: Release 11.2.0.3.0 - Development on Tue Jan 10 10:57:59 2012
 
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
 
 
 
********************************************************************************
 
SQL ID: c1yk5pv0v1wg1 Plan Hash: 2931676921
 
ALTER TABLE CHF.T_XIFENFEI_MOVE MOVE TABLESPACE USERS
 
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.05          7          8          0           0
Execute      1     11.29     131.23     105584     106275     115654     7432085
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2     11.30     131.29     105591     106283     115654     7432085
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         0          0          0  LOAD AS SELECT  (cr=117799 pr=105602 pw=105585 time=131351005 us)
   7432085    7432085    7432085   TABLE ACCESS FULL T_XIFENFEI_MOVE (cr=105591 pr=105586 pw=0 time=4735560 us cost=23453 size=720912245 card=7432085)
 
********************************************************************************

從這裏可以看出執行move,其實本質是全表掃描表,然後append方式插入數據,而不是真的數據塊拷貝

3.測試CAST
3.1).CAST插入數據過程

SQL> alter system flush buffer_cache;

System altered.

SQL> SET TIMING ON;
SQL> alter session set events
2 ’10046 trace name context forever,level 1′;

Session altered.

Elapsed: 00:00:00.01
SQL> create table chf.t_xifenfei_move_new tablespace test_ocp
2 as
3 select * from chf.t_xifenfei_move;

Table created.

Elapsed: 00:01:59.22
SQL> alter session set events
2 ’10046 trace name context off’;

Session altered.

Elapsed: 00:00:00.00
SQL> select d.value||’/'||lower(rtrim(i.instance,chr(0)))||’_ora_’||p.spid||’.trc’ trace_file_name from
2 (select p.spid from v$mystat m, v$session s,v$process p where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr ) p,
3 (select t.instance from v$thread t,v$parameter v where v.name = ‘thread’ and(v.value = 0 or t.thread# = to_number(v.value))) i,
4 (select value from v$parameter where name = ‘user_dump_dest’) d;

TRACE_FILE_NAME
——————————————————————————–
/opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_5121.trc

從這裏看出cast操作用時:00:01:59.22,比move稍微少,但是cast要實現move完全的功能,還需要表重命名,表授權,編譯無效對象等。

3.2)查看trace內容

[oracle@node1 ~]$ tkprof  /opt/oracle/diag/rdbms/chf/chf/trace/chf_ora_5121.trc /tmp/xifenfei_create.txt
 
TKPROF: Release 11.2.0.3.0 - Development on Tue Jan 10 11:08:19 2012
 
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
 
 
********************************************************************************
 
create table chf.t_xifenfei_move_new tablespace test_ocp
as
select * from chf.t_xifenfei_move
 
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.02          1          4          0           0
Execute      1      9.85     118.37     105587     106097     112387     7432085
Fetch        0      0.00       0.00          0          0          0           0
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        2      9.85     118.40     105588     106101     112387     7432085
 
Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS
Number of plan statistics captured: 1
 
Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         0          0          0  LOAD AS SELECT  (cr=106631 pr=105592 pw=105585 time=118338607 us)
   7432085    7432085    7432085   TABLE ACCESS FULL T_XIFENFEI_MOVE (cr=105591 pr=105586 pw=0 time=2935008 us cost=23453 size=720912245 card=7432085)
 
********************************************************************************

通過這個可以看出,CAST其實本質也是全表掃描,然後append方式插入數據

4.比較move和cast
4.1)通過比較執行時間,cast稍微少,但是還有後續操作需要時間
4.2)通過比較執行計劃,兩者是一樣的
4.3)move操作在整個過程中都會鎖表,而cast不會鎖住原表(select+where可以減少停業務時間)
4.4)move操作會一次性處理好權限,plsql/view等有效,而cast在rename之後,相關對象可能需要重新編譯,重新授權等操作
4.5)cast操作index需要新建(create),而move操作index需要重建(rebuild)
4.6)cast完成後,需要對錶重命名,刪除原表操作操作,而這個操作move不用

5.選擇使用誰
5.1)如果停業務時間夠長,建議使用move操作
5.2)如果停業務時間不能太長,可以使用cast+where實現
5.3)如果數據庫版本>=10g,且表空間使用local管理,那麼可以考慮在不停業務的情況下使用shrink實現類此功能

至於MOVE和CAST在執行過程中,關於產生的redo和undo的比較,請見下篇:MOVE和CAST比較(續)




原文地址:http://www.xifenfei.com/2012/01/move%E5%92%8Ccast%E6%AF%94%E8%BE%83.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章