如果分区超过三个月,我需要从间隔分区表中删除分区。
是否有 oracle 实用程序/功能来执行此操作?或者如果没有,如何实现?请指导我。
Database version: Oracle 11G
如果分区超过三个月,我需要从间隔分区表中删除分区。
是否有 oracle 实用程序/功能来执行此操作?或者如果没有,如何实现?请指导我。
Database version: Oracle 11G
我不知道有任何 oracle 实用程序或函数可以做到这一点。您可以在 DBA_TAB_PARTITIONS 或 ALL_TAB_PARTITIONS 视图中找到编写自己的程序来执行此操作所需的信息,类似于以下内容:
SELECT TABLE_OWNER, TABLE_NAME, PARTITION_NAME, HIGH_VALUE
FROM SYS.DBA_TAB_PARTITIONS
WHERE TABLE_OWNER = strSchema AND
TABLE_NAME = strTable
其中 strSchema 和 strTable 是您感兴趣的模式和表。HIGH_VALUE 是一个 LONG 字段,其中包含调用 TO_DATE 函数的代码(假设您的表在日期字段上分区);您需要将 HIGH_VALUE 分配给 LONG 字段,然后将 LONG 分配给 VARCHAR2 以便在可以操作的地方获取值,其方式类似于:
lHigh_value LONG;
strDate_clause VARCHAR2(100);
lHigh_value := aRow.HIGH_VALUE;
strDate_clause := lHigh_value;
然后,您只需从 DATE 子句中提取适当的字段,以确定您需要删除哪些分区。
分享和享受。
这是不可靠和不优雅的,但它确实适用于VALUES LESS THAN some_date
在 DBA_TAB_PARTITIONS 中转换表达式,至少对于 10g 和 11g 中的范围分区,包括区间分区。受到Tom Kyte 的“评估表达”问题的启发。你的旅费可能会改变。
declare
l_hival varchar2(4000);
l_sql varchar2(4000);
l_high_date date;
l_cursor integer default dbms_sql.open_cursor;
l_rows_back number;
begin
-- partition position = 1 always grabs the "oldest" partition
select high_value
into l_hival
from dba_tab_partitions
where table_name = <my_range_partitioned_table>
and partition_position = 1;
dbms_sql.parse (l_cursor,
'begin :retval := ' || l_hival || '; end;',
dbms_sql.native);
dbms_sql.bind_variable (l_cursor, ':retval', l_high_date);
l_rows_back := dbms_sql.execute (l_cursor);
dbms_sql.variable_value (l_cursor, ':retval', l_high_date);
dbms_output.put_line (to_char(l_high_date, 'yyyy-mm-dd-hh24.mi.ss'));
end;
/
由于它是 PL/SQL,因此可以将其封装到一个函数中,以返回作为参数传入的任何分区表的“高值”。
如果 11g 中有自动解决方案,我也很感兴趣。
在旧版本中,我使用以下两种方法之一:
坚持分区名称的严格名称标准,例如SALE201101
,SALE201102
(对于 2011 年 1 月和 2 月),您可以从中提取相关数据ALL_TAB_PARTITIONS
,然后您可以删除任何最旧的分区。
吸收它并使用一个小元数据表,其中一列用于 partition_name,一列用于时间段(无论是日期、周、月、双月、每年、零售周)。然后我选择最旧的时间段并删除关联的分区。
这不是“全自动”,但它使自动化更容易。