Partitioning

重命名間隔分區系統生成的分區名稱

  • December 11, 2013

我有一個現有的表,我使用dbms_redefnition.

PARTITION BY RANGE ("TIME_ID") INTERVAL (NUMTODSINTERVAL(1,'DAY')) 
(PARTITION "p1_1"  VALUES LESS THAN (TO_DATE(' 01-jan-2013','DD-MON-YYYY' )))

這給了我一個新的系統每天生成的分區名稱(如SYS41, SYS42, …)。

我有兩個問題:

  1. 我想要一個應該每天執行的腳本,並將這個系統生成的名稱更改為自定義名稱(例如每個日期的“01-jan-2013”​​等等)。這個腳本應該每天通過dbms_scheduler. 我有一個腳本,它給了我最新創建的分區的名稱。
SELECT PARTITION_NAME FROM DBA_TAB_PARTITIONS A
WHERE PARTITION_POSITION = (
 SELECT MAX(PARTITION_POSITION) 
 FROM USER_TAB_PARTITIONS B
 WHERE A.TABLE_NAME = B.TABLE_NAME
   AND B.TABLE_NAME = 'IPART'
);

這可能會幫助您給出答案。 2. 我想要一個應該自動刪除舊分區(比如 3 個月)的腳本。這也應該每天執行。這 3 個月的時間應該是可配置的。

我怎樣才能做到這一點?

您可以使用一個技巧,至少對於日期範圍分區:HIGH_VALUE欄位 inuser_tab_partitions是有效的日期表達式。如果您“評估”它,您將獲得該分區的截止點的日期對象。然後,您可以使用它來建構您的分區名稱。

要試用的範例 PL/SQL(從high_value列生成字元串):

declare
 hv varchar2(9);
begin
 for x in (select partition_name, high_value
             from user_tab_partitions
             where table_name = 'FOO' and partition_name not like 'PART_%')
 loop
   execute immediate 'select to_char('||x.high_value||'-1,''YYYYMMDD'') from dual' into hv;
   dbms_output.put_line('alter table foo rename partition '||x.partition_name
                      ||' to PART_'||hv);
 end loop;
end;
/

(一旦您確認它確實執行了您想要的操作,請將 替換為put_line。日期選擇中的execute immediate``-1

至於刪除舊分區,您可以使用相同的技巧。相同類型的循環為每個分區獲取一個日期對象,並alter table ... drop partition ...為您不想保留的分區生成一個語句。

簡單的範例,您將刪除超過 10 天的分區(要警惕一個錯誤,下面可能有一個錯誤):

declare
 dt date;
begin
 for x in (select partition_name, high_value
             from user_tab_partitions
             where table_name = 'FOO')
 loop
   execute immediate 'select '||x.high_value||' from dual' into dt;
   if dt < sysdate - 10 then
     dbms_output.put_line('to drop: '||x.partition_name);
   end if;
 end loop;
end;
/

如有必要,您將負責索引維護。

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