操作背景:
 
某業務局點,oracle9208資料庫+AIX5306,由於業務增長迅速,相對應的幾個表資料增長很快,影響系統執行速度。需要對其進行清理。由於該表有大量資料如果直接執行delete操作不能很快釋放所佔用的表空間,需做:
1. TABLEA表進行truncate操作來釋放表空間;
2. TABLEB表沒有本地索引,需要新建本地索引。
 
一:處理思路:
 
1. 備份需要留下的資料
create table TABLEA0529 as
 select *
 from tableA b
 WHERE b.SendTime <= SYSDATE
   AND b.InvalidTime > SYSDATE
   AND b.invalidflag = 0
   and b.sendtime>sysdate-90;
注:此種方式建立的表沒有索引和主鍵,需要另外用指令碼建。
2. 清空原表資料
     truncate table TABLEA;
3. 匯入備份的資料,刪除原備份表
 insert into   TABLEA
 select * from TABLEA0529;
 commit;
 
  drop table TABLEA0529;
4. 重新編譯儲存過程。
 
二.詳細處理步驟:
由於TABLEB表為分割槽表,資料量超大,並且新建索引時不允許有程式訪問該表,為不影響現網業務,需要先建立一個和現網表完全一致的備份表,但是資料為空,在該表建立好本地索引,然後將現網表和索引均更名,然後將備份表的表名和索引修改為現網一致。最後匯入需要保留的資料。以下為具體步驟
如何查詢未採用本地索引的資料:
SELECT distinct table_name FROM USER_INDEXES A
WHERE A.table_name IN(SELECT B.table_name FROM USER_TABLES B WHERE B.partitioned = `YES`) AND A.partitioned = `NO`
1. 建立新的分割槽表
— Create table
create table TABLEB0529
(
 BULLETINID   VARCHAR2(20),
 STAFFNO      VARCHAR2(10),
 READFLAG     NUMBER(1) default 0,
 PARTID       VARCHAR2(1),
 READTIME     DATE,
 SENDTIME     DATE,
 INVALIDTIME DATE,
 BULLETINTYPE NUMBER(4),
 TYPENAME     VARCHAR2(16),
 INVALIDFLAG NUMBER(1),
 TITLE        VARCHAR2(100),
 SENDSTAFFNO VARCHAR2(20),
 GRADE        NUMBER(2),
 AFFIXPATH    VARCHAR2(2000)
)
partition by range (PARTID)
(
 partition P0 values less than (`1`)
    tablespace SERVICE_MAIN_DAT
    pctfree 10
    pctused 75
    initrans 4
    maxtrans 255
    storage
    (
      initial 1M
      next 1M
      minextents 1
      maxextents unlimited
      pctincrease 0
    ),
 partition P9 values less than (MAXVALUE)
    tablespace SERVICE_MAIN_DAT
    pctfree 10
    pctused 75
    initrans 4
    maxtrans 255
    storage
    (
      initial 1M
      next 1M
      minextents 1
      maxextents unlimited
      pctincrease 0
    )
)
;
2、建立本地索引
— Create/Recreate indexes
create index IX_BULLETINREAD_BULLETINID1 on TABLEB0529 (BULLETINID);
create index IX_BULLETINREAD_STAFFNO1 on TABLEB0529 (STAFFNO)
LOCAL
 tablespace SERVICE_MAIN_IDX
 storage
 (
    initial 1M
    next 1M
    minextents 1
    maxextents unlimited
    pctincrease 0
 );
3、 插入所需要的資料
insert into tableB0529
 select *
 from tableB t
 where t.bulletinid >=`2007011200002015`
   and t.bulletinid in (select distinct (b.bulletinid)
                          from tableA b
                         WHERE b.SendTime <= SYSDATE
                           AND b.InvalidTime > SYSDATE
                           AND b.invalidflag = 0
                           and b.sendtime > sysdate – 90);
commit;
 
4、 表名修改
 ALTER TABLE tableB RENAME TO tableBOLD;
 ALTER TABLE tableB0529 RENAME TO tableB;
 
5、索引修改:
 alter index IX_BULLETINREAD_BULLETINID rename to IX_BULLETINREAD_BULLETINID2;
 alter index IX_BULLETINREAD_BULLETINID1 rename to IX_BULLETINREAD_BULLETINID;
 
 alter index IX_BULLETINREAD_STAFFNO rename to IX_BULLETINREAD_STAFFNO2;
 alter index IX_BULLETINREAD_STAFFNO1 rename to IX_BULLETINREAD_STAFFNO;
 
6、 重新編譯儲存過程;
該步驟很重要一定要檢視執行完畢後是否存在失效的儲存過程。