Oracle分割槽表的一些簡單技巧
阿新 • • 發佈:2022-02-13
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,邏輯實現表同步之前的分割槽清空操作
具體程式碼如下
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