Partitioning
重命名間隔分區系統生成的分區名稱
我有一個現有的表,我使用
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
, …)。我有兩個問題:
- 我想要一個應該每天執行的腳本,並將這個系統生成的名稱更改為自定義名稱(例如每個日期的“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; /
如有必要,您將負責索引維護。