Oracle分区表详解,分区表创建,分区表按日期划分

前言(絮叨絮叨)

最近接手一个项目,要求与Oracle数据库做对接,分区表还是要做的,可是网上根本涉及内容很少,没办法,用一下午才弄明白,截至发稿,饭都没吃呢。。。。。。。。

分区表概念:

正常增删改查都行,SQL语句正常写,但是查询可以通过分区表进行区分查询,可以限定范围什么的,特别方便,而且快,不絮叨,直接说主题。

分区表创建

先说下,里面有两个地方需要注意,一个是分区字段名,这里用的是:WORKDATE,需要有个分区字段;
另外一个是划分分区时间的 less than(XXXX),这个时间是比较特殊,超过这个时间会自动创建额外的分区,但暂时这么理解吧,我一般管它叫默认时间,也可以创建多个,但是我都只创建一个,后续会自增。
月的,年的建议设置时间为每个月的01月1日。

创建日分区表

create table TTT(WORKDATE date)
PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTODSINTERVAL(1,'day'))
(    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

创建月分区表

create table TTT(WORKDATE date)
PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'month'))
(    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

创建年分区表

create table TTT(WORKDATE date)
PARTITION BY RANGE (WORKDATE) INTERVAL (NUMTOYMINTERVAL(1,'year'))
(    partition P_1995 values less than (TO_DATE('1995-12-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

报错信息解决:

报错:
ORA-14752: 间隔表达式不是正确类型的常数

解决:你写错了,日和周的是 NUMTODSINTERVAL,年的和月的 是 NUMTOYMINTERVAL
在这里插入图片描述

报错
ORA-14767: 无法使用现有上限指定此间隔

解决:你时间写的不对,时间不可以超过指定时间
月不超过 28号
年不能超过31号

在这里插入图片描述

问题:

**为什么我创建的都是第二天的分区表?

需求:我想建分区表时候,插一条数据是创建当前时间的分区

对于日频度的来说:

默认日期建议是,是 TO_DATE(‘1995-01-01 00:00:00’, ‘SYYYY-MM-DD HH24:MI:SS’),在这个时间里就会创建当天的分区,超过会创建下一天的分区。

(    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

对于月频度的来说:

1号最好

(    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

对于年频度的来说

1号最好

(    partition P_1995 values less than (TO_DATE('1995-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS')));

如果给你提供到了帮助,评论下,点个关注,给个赞。

  • 19
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Oracle中,为分区创建索引与为非分区创建索引基本相同,只需要在创建索引时指定分区分区键即可。 下面是一个示例: ``` CREATE TABLE my_partitioned_table ( id NUMBER(10) NOT NULL, created_at TIMESTAMP(6) NOT NULL, some_data VARCHAR2(100), CONSTRAINT pk_my_partitioned_table PRIMARY KEY (id, created_at) ) PARTITION BY RANGE (created_at) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2018-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2019-01-01', 'YYYY-MM-DD')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ); CREATE INDEX idx_my_partitioned_table ON my_partitioned_table(created_at, some_data) GLOBAL PARTITION BY RANGE (created_at) ( PARTITION p1 VALUES LESS THAN (TO_DATE('2018-01-01', 'YYYY-MM-DD')), PARTITION p2 VALUES LESS THAN (TO_DATE('2019-01-01', 'YYYY-MM-DD')), PARTITION p3 VALUES LESS THAN (MAXVALUE) ); ``` 在这个示例中,我们创建了一个名为 `my_partitioned_table` 的分区,它根据 `created_at` 列的值进行分区。然后,我们为该创建了一个名为 `idx_my_partitioned_table` 的索引,该索引也根据 `created_at` 列的值进行分区。 注意,我们在创建索引时使用了 `GLOBAL PARTITION BY RANGE` 语句,这是因为我们想要为每个分区创建一个单独的索引分区,以便能够更好地利用分区的性能优势。 需要注意的是,在为分区创建索引时,我们必须指定每个分区的索引分区。如果我们不这样做,Oracle将自动为我们创建一个全局索引分区,这会导致性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值