定期刪除數據爲空的分區表

在數據庫日常管理中,對大表進行分區表是一個不錯的策略,分區不僅可以優化表的性能還能對數據進行歸檔和易於管理。但是如果表的數據會定期刪除,比如保留3-6個月的數據,那麼會有很多數據保留在數據庫中,需要進行定期清理。一下存儲過程是識別空行分區並定期刪除。

CREATE OR REPLACE PROCEDURE TEST_SCHEMA.TRUNC_SUB_PARTITION 
(
TNAME 			IN 		VARCHAR2        	--TABLE NAME
--PROC_STATUS 	OUT 	VARCHAR2,  			--PROCEDURE EXCEPTION CODE.
--IMP_ROWS	 	OUT    	NUMBER    			--THE ARCHIVED ROWS
)
AS
PROC_NAME 	VARCHAR2(32);			---PARTITION NAME
NUM_ROWS	NUMBER;					---PARTITION ROWS
TOWNER 		VARCHAR2(32) default SYS_CONTEXT('USERENV','CURRENT_SCHEMA');
OPT_MSG		VARCHAR2(512);
QUERYTAB	VARCHAR2(128);
TRUNCTAB	VARCHAR2(128);
CURSOR GET_PART IS 
SELECT PARTITION_NAME,PARTITION_POSITION,NUM_ROWS,HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = TNAME ORDER BY 2;
CUR GET_PART%ROWTYPE;
BEGIN
--SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') INTO TOWNER FROM DUAL;
DBMS_OUTPUT.PUT_LINE(TOWNER);
PROC_NAME := 'TRUNC_SUB_PARTITION';
--TOWNER := 'TEST_SCHEMA';
--DBMS_STATS.GATHER_TABLE_STATS(TOWNER,TNAME); 		--GATHER THE STATISTICS OF THE TABLE 
--DBMS_OUTPUT.PUT_LINE(TRUNCTAB);
FOR CUR IN GET_PART LOOP
QUERYTAB := 'select count(1) from '||TOWNER||'.'||TNAME||' partition ('||CUR.PARTITION_NAME||')';
DBMS_OUTPUT.PUT_LINE(QUERYTAB);
EXECUTE IMMEDIATE QUERYTAB INTO NUM_ROWS;
IF NUM_ROWS = 0 
THEN 
TRUNCTAB := 'ALTER TABLE '||TOWNER||'.'||TNAME||' DROP PARTITION ('||CUR.PARTITION_NAME||') UPDATE INDEXES';
--NUM_ROWS := CUR.NUM_ROWS;
DBMS_OUTPUT.PUT_LINE(TRUNCTAB);
DBMS_OUTPUT.PUT_LINE('DROP table success');
EXECUTE IMMEDIATE TRUNCTAB;
--IMP_ROWS := SQL%ROWCOUNT;
OPT_MSG	 := 'SUCCESSFUL';
GEN_TEST_SCHEMA.PROC_EXEC_TT(PROC_NAME,0,TNAME,NUM_ROWS,OPT_MSG);
Else
OPT_MSG := 'Partition number:'||NUM_ROWS;
DBMS_OUTPUT.PUT_LINE(OPT_MSG);
--GEN_TEST_SCHEMA.PROC_EXEC_TT(PROC_NAME,1,TNAME,NUM_ROWS,OPT_MSG);
END IF;
END LOOP;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
OPT_MSG := 'NO PARTITION FOUND!';
GEN_TEST_SCHEMA.PROC_EXEC_TT(PROC_NAME,1,TNAME,NUM_ROWS,OPT_MSG);
COMMIT;
WHEN OTHERS  THEN  
--PROC_STATUS := SQLERRM;
DBMS_OUTPUT.PUT_LINE('SQLCODE : ' ||SQLCODE);
DBMS_OUTPUT.PUT_LINE('SQLERRM : ' ||SQLERRM); 
OPT_MSG := SQLCODE||':'||SQLERRM;
GEN_TEST_SCHEMA.PROC_EXEC_TT(PROC_NAME,3,TNAME,NUM_ROWS,OPT_MSG);
COMMIT;
END;
/

該存儲過程會自動識別空行分區並刪除,同時重建索引。

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