1. 程式人生 > 其它 >Oracle分割槽表的一些簡單技巧

Oracle分割槽表的一些簡單技巧

1.查詢表分割槽的情況

 SELECT *  FROM USER_TAB_PARTITIONS
  WHERE TABLE_NAME = XXXX

可查對應表的具體分割槽情況

2.分割槽表清空指定分割槽

不刪分割槽僅清空分割槽資料推薦使用

ALTER TABLE TABLE_NAME TRUNCATE PARTITION_NAME

不建議使用

DELETE FROM TABLE_NAME WHERE PARTITION_NAME = XXXX

DELETE FROM 的形式對於資料量大的表來說有可能導致資料庫服務卡死,且對水位線無影響

清空資料且刪除資料

ALTER TABLE TABLE_NAME DROP PARTITION PARTITION_NAME

3.結合以上兩點的一個小的實際應用

目標表為list分割槽,且儲存週期為36個月,每個儲存週期為1個分割槽,分割槽名為SUM_MONTHYYYYMM,邏輯實現表同步之前的分割槽清空操作

Created with Raphaël 2.2.0
開始 判斷是否已有指定的分割槽 清空指定分割槽 結束 判斷分割槽表的分割槽是否超過36個 刪除最小週期 新增指定分割槽 yes no
yes no

具體程式碼如下

DECLARE
  V_SQL       VARCHAR2(500);
  V_SUM_MONTH VARCHAR2(10) := '201910';
  V_PART_RES  NUMBER :=0;
  V_PART_NUM  NUMBER :=0;
  V_MIN_MONTH VARCHAR2(30);
BEGIN
  V_SQL := 'SELECT COUNT(1) FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = ''TABLE_NAME'' AND PARTITION_NAME= ''SUM_MONTH' || V_SUM_MONTH || '''';
  EXECUTE IMMEDIATE V_SQL
    INTO V_PART_RES;
  --DBMS_OUTPUT.PUT_LINE(V_PART_RES);
  IF V_PART_RES = 0 THEN --判斷是否有對應分割槽
    BEGIN --沒有分割槽則新增對應分割槽
      V_SQL := 'SELECT COUNT(1) FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = ''TABLE_NAME''';
      EXECUTE IMMEDIATE V_SQL  INTO V_PART_NUM; --查詢當前儲存週期數
      IF V_PART_NUM >= 36 THEN --超過36個週期清除最小週期
        BEGIN
          V_SQL := 'SELECT MIN(PARTITION_NAME) FROM USER_TAB_PARTITIONS WHERE TABLE_NAME = ''TABLE_NAME''';
          EXECUTE IMMEDIATE V_SQL  INTO V_MIN_MONTH; --查詢當前最小統計週期
          EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME DROP PARTITION ' ||V_MIN_MONTH; --刪除最早的分割槽
        END;
      END IF;
      V_SQL := 'ALTER TABLE TABLE_NAME ADD PARTITION SUM_MONTH' ||
               V_SUM_MONTH || ' VALUES(''' || V_SUM_MONTH || ''')';
      EXECUTE IMMEDIATE V_SQL;
    END;
  ELSE
    BEGIN --有分割槽則清空對應分割槽
      EXECUTE IMMEDIATE 'ALTER TABLE TABLE_NAME TRUNCATE PARTITION SUM_MONTH'||V_SUM_MONTH;
    END;
  END IF;
END;

需要注意,分割槽名稱格式得固定,且需要同步的分割槽欄位格式不變
如果有其他更好的實現方法歡迎討論

本文來自部落格園,作者:Splus,轉載請註明原文連結:https://www.cnblogs.com/s-plus/p/15889930.html