4

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

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

Database version: Oracle 11G
4

3 回答 3

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 子句中提取适当的字段,以确定您需要删除哪些分区。

分享和享受。

于 2011-04-04T12:50:58.477 回答
3

这是不可靠和不优雅的,但它确实适用于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,因此可以将其封装到一个函数中,以返回作为参数传入的任何分区表的“高值”。

于 2011-04-05T13:56:16.197 回答
0

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

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

  2. 吸收它并使用一个小元数据表,其中一列用于 partition_name,一列用于时间段(无论是日期、周、月、双月、每年、零售周)。然后我选择最旧的时间段并删除关联的分区。

这不是“全自动”,但它使自动化更容易。

于 2011-04-04T21:35:52.573 回答