【问题标题】:Partition by range in oracle using sysdate使用 sysdate 在 oracle 中按范围分区
【发布时间】:2021-10-21 21:55:30
【问题描述】:

我想根据 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”

那我可以在这里做什么?

【问题讨论】:

  • sale_date 不存在。该表必须包含您喜欢用作分区键的列。

标签: oracle oracle12c dynamic-sql database-partitioning


【解决方案1】:

你不能那样做。遵循文档

创建范围分区表

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

VALUES LESS THAN 子句确定分区边界:具有 分区键值比较小于的有序列表 子句指定的值存储在分区中。每个 分区有一个名称(sales_q1、sales_q2、...),并且每个 分区包含在单独的表空间(tsa、tsb、...)中。

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

记住目的或分区。这个想法是使用键列将大段(表)拆分为较小的段(分区)。在您的情况下,您希望将键列小于 sysdate-90 的行存储在一个分区中,这意味着今天该行将转到一个分区,但是如果满足条件 sysdate-90 在一天后,行应该移动到另一个分区。

如果你无论如何都想这样做,虽然我不推荐这样做,但你必须开发自己的维护流程:

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

希望它澄清

【讨论】:

    【解决方案2】:

    你可以使用

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

    如果您的应用程序从 2021 年 8 月 1 日开始添加数据,那么 Oracle 将为 2021-08-01 创建一个新分区,它可以处理间隙或缺失的日期。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多