在oracle中使用sysdate按范围划分分区



我想动态创建依赖于sysdate的分区,如:

create table partition_interval_demo
( id         number(6)
, val        varchar2(50)
, date_create  date)
partition by range (sale_date) interval (interval '1' day)
( partition p1 values less than ((sysdate-90)));

,但我有错误,如

ORA-14019:分区绑定元素必须是:字符串、日期时间或间隔文字、数字或MAXVALUE">

我能做什么呢?

你不能那样做。遵循文档

创建范围分区表

CREATE TABLE语句的PARTITION BY RANGE子句指定表或索引将被范围分区。分区子句标识单独的分区范围,而可选的分区子句的子句可以指定物理的和其他的特定于分区段的属性。,如果没有重写分区级,分区继承其底层的属性表。

VALUES LESS THAN子句决定了分区的边界:行的有序列表中比较较小的分区键值子句指定的值存储在分区中。每一个分区被赋予一个名称(sales_q1, sales_q2,…分区包含在单独的表空间(tsa, tsb,…)

这意味着键值的范围是确定的。sysdate是一个函数,因此在执行之前它不是一个值。它不能是范围分区键值的一部分。

记住分区的目的。其思想是使用一个键列将一个大的段(表)分成更小的段(分区)。在您的示例中,您希望在一个分区中存储键列小于sysdate-90的行,这意味着今天该行将转移到一个分区,但在某一天,如果满足条件sysdate-90,该行应该移动到另一个分区。

如果你想这样做,尽管我不建议这样做,你将不得不开发你自己的维护过程:

  1. 表有每个日期的键(每个日期有3个月的分区)
  2. 分区其他人将获得其他所有内容,因此任何与任何现有分区键不匹配的内容。
  3. 每天您都必须检索符合sysdate-90条件的记录,并将它们移动到others分区。
  4. 要做到这一点,你需要在你的表中启用行移动:alter table xx enable row movement

希望它能澄清

可以使用

partition p1 values less than (DATE '2021-01-01')

如果您的应用程序添加数据,让我们说2021-08-01,那么Oracle将为2021-08-01创建一个新的分区,它可以处理间隙或丢失的天数。

如果您使用SEGMENT CREATION DEFERRED子句(可能同时是默认的),那么初始分区甚至不会占用磁盘上的任何空间。

最新更新