在oracle 11G中自动删除最旧的分区

时间:2011-04-04 09:43:22

标签: oracle oracle11g database-partitioning

如果分区超过三个月,我需要从间隔分区表中删除分区。

是否有oracle实用程序/函数来执行此操作?或者如果没有,如何实现这个?请指导我。

Database version: Oracle 11G

3 个答案:

答案 0 :(得分:3)

我不知道有任何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子句中提取相应的字段,以确定需要删除的分区。

分享并享受。

答案 1 :(得分:3)

这是不稳定且不优雅的,但它确实适用于在DBA_TAB_PARTITIONS中转换VALUES LESS THAN some_date表达式,至少对于范围分区,包括间隔分区,在10g和11g中。灵感来自Tom Kyte's "Evaluate Expression"问题。您的里程可能会有所不同。

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,它可以封装到一个函数中,以返回作为参数传入的任何分区表的“高值”。

答案 2 :(得分:0)

如果11g中有自动解决方案,我也很感兴趣。
在旧版本中,我使用以下两种方法之一:

  1. 坚持使用严格的分区名称标准,例如SALE201101SALE201102(2011年1月和2011年2月),可以从ALL_TAB_PARTITIONS中提取相关数据然后你可以删除最旧的分区。

  2. 将其吸取并使用一个小的元数据表,其中一列为partition_name,另一列为正确类型的列(无论是日期,星期,月份,双月,年度,零售周)。然后我选择最早的时间段并删除相关的分区。

  3. 这不是“完全自动化”,但它使自动化变得更容易。