操作背景:
某業務局點,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、 重新編譯儲存過程;
該步驟很重要一定要檢視執行完畢後是否存在失效的儲存過程。