Oracle
刪除 Oracle 11g DB 中的空分區
我的任務是從數據倉庫中刪除空(0 行)分區和子分區。
我正在準備腳本:
- 將計算分區/子分區的行數
- 當行數為 0 時,應刪除分區(和確認消息)
- 當行數不為 0 時,提示此分區不為空
為了檢查我創建的行數,
SELECT 'partition_name', COUNT(*) FROM user.table PARTITION (partition_name);
我被告知 count 將比基於DBA_TAB_PARTITIONS
or的 NUM_ROWS 列更好DBA_TAB_SUBPARTITIONS
(但是,我將從這 2 列中提取具有其他數據的潛在候選人列表以供以後分析)。還建議我不要使用 dbms.output。有數以百萬計的潛在候選人(在某些數據庫上超過 1000 萬)。在分析階段,我計劃使用 Excel 過濾器排除“MAXVALUE”分區和 HASH 類型,然後使用上述腳本。
**有人有類似的腳本嗎?**我需要一個分區的模式,然後我將在 Excel 中生成其餘部分。 在分析階段是否有更多的東西要從下拉列表中排除?
我正在使用這樣的程序:
PROCEDURE MaintainPartitions IS CURSOR PartTables IS SELECT TABLE_NAME, PARTITION_NAME, HIGH_VALUE FROM USER_TAB_PARTITIONS WHERE TABLE_NAME LIKE .... ORDER BY TABLE_NAME, PARTITION_POSITION; cur SYS_REFCURSOR; r INTEGER; highValue VARCHAR2(100); BEGIN FOR aTab IN PartTables LOOP EXECUTE IMMEDIATE 'BEGIN :ret := '||aTab.HIGH_VALUE||'; END;' USING OUT highValue; IF highValue NOT IN ('DEFAULT', 'MAXVALUE') THEN OPEN cur FOR 'SELECT ROWNUM FROM '||aTab.TABLE_NAME||' PARTITION ('||aTab.PARTITION_NAME||') WHERE ROWNUM <= 1'; FETCH cur INTO r; IF cur%NOTFOUND THEN EXECUTE IMMEDIATE 'ALTER TABLE '||aTab.TABLE_NAME||' DROP PARTITION '||aTab.PARTITION_NAME||' UPDATE INDEXES'; END IF; CLOSE cur; END IF; END LOOP; END;
請注意,您不能刪除子分區。在這種情況下,您必須使用 TRUNC。
另請注意,如果是 INTERVAL 分區,您可能會遇到
ORA-14758: Last partition … cannot be dropped
. 看看https://stackoverflow.com/questions/1395379/unable-to-delete-oldest-table-partition來管理它。