處理表的行遷移的問題

eric0435發表於2012-05-24
檢測遷移和連結
使用ANALYZE 命令檢測遷移和連結:
SQL> ANALYZE TABLE oe.orders COMPUTE STATISTICS;
Table Analyzed.
SQL> SELECT num_rows, avg_row_len, chain_cnt
2 FROM DBA_TABLES
3 WHERE table_name='ORDERS';
NUM_ROWS   AVG_ROW_LEN   CHAIN_CNT
---------- ----------- ----------
1171         67          83
使用Statspack/AWR 檢測遷移和連結:
Statistic                                      Total       per Second    per Trans
table fetch continued row                      34,964            0.7          0.2

先執行utlchain.sql指令碼來建立CHAINED_ROWS表
SQL> @D:\oracle\product\10.2.0\db_1\RDBMS\ADMIN\utlchain.sql
選擇已遷移的行
SQL> ANALYZE TABLE oe.orders LIST CHAINED ROWS;
Table analyzed.
SQL> SELECT owner_name, table_name, head_rowid
2 FROM chained_rows
3 WHERE table_name = 'ORDERS';
OWNER_NAME TABLE_NAME HEAD_ROWID
---------- ---------- ------------------
SALES ORDER_HIST AAAAluAAHAAAAA1AAA
SALES ORDER_HIST AAAAluAAHAAAAA1AAB

消除已遷移的行
 匯出/匯入:
– 匯出表
– 刪除或截斷表
– 匯入表
 MOVE 表命令:
– ALTER TABLE EMPLOYEES MOVE
 重新定義聯機表
 複製已遷移的行:
– 使用ANALYZE 查詢遷移的行
– 將遷移的行復制到新表
– 從原始表刪除遷移行
– 將行從新表複製到原始表
下面是採用MOVE表命令的方式
-- Created on 2012-5-24 by ADMINISTRATOR
declare
 cursor lj is SELECT table_name, num_rows, avg_row_len, chain_cnt FROM DBA_TABLES a where a.owner='SSCP2'
 and a.chain_cnt>0;
 cursor sy(p_tablename in varchar2) is
 select * from dba_indexes a where a.owner='SSCP2' and a.table_name=''||''||p_tablename||''||'';
 sql_c varchar2(200):=null;
 cl_flag number(2):=1;
begin
   for r in lj loop
     sql_c:=null;
     sql_c:='alter table sscp2.'||r.table_name||' move';
     begin
     execute immediate ''||sql_c;
     exception
       when others then
       dbms_output.put_line('執行表移動出錯的表'||r.table_name);
       cl_flag:=0;
     end ;
     if cl_flag=1 then
         for l in sy(r.table_name) loop
           dbms_output.put_line(l.index_name);
           sql_c:=null;
           sql_c:='alter index sscp2.'||l.index_name||' rebuild';
           begin
           execute immediate ''||sql_c;
           exception
           when others then
           dbms_output.put_line('重建出錯的索引'||l.index_name);
           end ;
         end loop;
         sql_c:='analyze table sscp2.'||r.table_name||' compute statistics';
         begin
          execute immediate ''||sql_c;
         exception
           when others then
           dbms_output.put_line('分析表出錯'||r.table_name);
         end ;
      end if;
   end loop;
end;
SQL> SELECT table_name, num_rows, avg_row_len, chain_cnt FROM DBA_TABLES a where a.owner='SSCP2'
  2   and a.chain_cnt>0;

TABLE_NAME                       NUM_ROWS AVG_ROW_LEN  CHAIN_CNT
------------------------------ ---------- ----------- ----------
ABSB                              2479525         114       3041
ABS8                             29230869         149     195428
IDS2                               453402          60        132
ICSW                                78087          37         37
ICS1                               759167          49       5521
IC12                               729809         111          9
IC10                               256770         170         62
ADS3                             17472005         186       2221
ADS1                               544695         130         53
ACSN                                39821          90          4
ACS6                              1940197          82        162

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-730801/,如需轉載,請註明出處,否則將追究法律責任。

相關文章