Oracle

刪除 Oracle 11g DB 中的空分區

  • June 27, 2017

我的任務是從數據倉庫中刪除空(0 行)分區和子分區

我正在準備腳本

  1. 將計算分區/子分區的行數
  2. 當行數為 0 時,應刪除分區(和確認消息)
  3. 當行數不為 0 時,提示此分區不為空

為了檢查我創建的行數,SELECT 'partition_name', COUNT(*) FROM user.table PARTITION (partition_name); 我被告知 count 將比基於DBA_TAB_PARTITIONSor的 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來管理它。

引用自:https://dba.stackexchange.com/questions/177278