暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle有没有MySQL的分区DDL遇到的问题

原创 薛晓刚 2023-03-28
477

     上次写到MySQL在分区上做了加字段以后不能交换分区,看看Oracle怎么样?

表和MySQL一模一样,只是这里用了自动分区。(既然有这个功能为什么不用,还用了自增和MySQL一样了)

SQL> create table pa(
2 id int generated as identity (start with 1 increment by 1),
3 day date,
4 a int,
5 primary key (id)
6 )
7 partition by range(day)
8 interval (numtodsinterval(1,'day'))
9 (
10 partition p1 values less than (to_date('20200101','yyyyMMdd'))
11 );

Table created

写入几条数据,造成分区扩展。
SQL>
SQL> insert into pa (day,a) values (to_date('2020-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2021-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2022-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2023-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2024-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2025-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> insert into pa (day,a) values (to_date('2026-05-01','yyyy-mm-dd'),1);

1 row inserted


SQL> commit;

Commit complete

然后建立一个一模一样结构的非分区表。记住一模一样。

create table a(
id int generated as identity (start with 1 increment by 1),
day date,
a int,
primary key (id)
);

Table created



查询分区表数据

SQL> select * from pa;
Warning: connection was lost and re-established

ID DAY A
--------------------------------------- ----------- ---------------------------------------
1 2020/5/1 1
2 2021/5/1 1
3 2022/5/1 1
4 2023/5/1 1
5 2024/5/1 1
6 2025/5/1 1
7 2026/5/1 1

7 rows selected


查询分区情况

SQL> select table_name,partition_name from user_tab_partitions;

TABLE_NAME PARTITION_NAME
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
PA P1
PA SYS_P1193
PA SYS_P1194
PA SYS_P1195
PA SYS_P1196
PA SYS_P1197
PA SYS_P1198
PA SYS_P1199

8 rows selected


测试分区有数据。
SQL> select * from pa partition (SYS_P1193);

ID DAY A
--------------------------------------- ----------- ---------------------------------------
1 2020/5/1 1

和MySQL一样交互。语法都一样。没有问题。

SQL> ALTER TABLE pa EXCHANGE PARTITION sys_p1193 WITH TABLE a;

Table altered


第一阶段完全符合预期。

SQL> select * from pa;

ID DAY A
--------------------------------------- ----------- ---------------------------------------
2 2021/5/1 1
3 2022/5/1 1
4 2023/5/1 1
5 2024/5/1 1
6 2025/5/1 1
7 2026/5/1 1

6 rows selected


SQL> select * from a;

ID DAY A
--------------------------------------- ----------- ---------------------------------------
1 2020/5/1 1

SQL> 


++++++++++++++++++++++++++++++++++++++++

下面就是看看加字段的影响了

SQL> alter table pa add new int ;  (这里注意,不能有默认值,也不能使用快速加字段的特性)

Table altered


SQL> select * from pa;

ID DAY A NEW
--------------------------------------- ----------- --------------------------------------- ---------------------------------------
2 2021/5/1 1
3 2022/5/1 1
4 2023/5/1 1
5 2024/5/1 1
6 2025/5/1 1
7 2026/5/1 1

6 rows selected


SQL>
SQL> create table b(
2 id int generated as identity (start with 1 increment by 1),
3 day date,
4 a int,
5 new int,
6 primary key (id)
7 );

Table created


SQL> ALTER TABLE pa EXCHANGE PARTITION sys_p1194 WITH TABLE b;

Table altered


SQL> select * from pa;

ID DAY A NEW
--------------------------------------- ----------- --------------------------------------- ---------------------------------------
3 2022/5/1 1
4 2023/5/1 1
5 2024/5/1 1
6 2025/5/1 1
7 2026/5/1 1



SQL> select * from b;

ID DAY A NEW
--------------------------------------- ----------- --------------------------------------- ---------------------------------------
2 2021/5/1 1 


实验成功。即Oracle在不带default 或者不带not null的时候可以成功。


但是注意一旦带上默认值或者用快速加字段的特性,那么就和MySQL一样了。那么问题又来了,这种要去做交互分区必然是大表,大表不用快速加字段,还有什么意义?

所以这种低价值的流水接口表要求上线前就定义好,不再进行增加字段的DDL。

最后修改时间:2023-03-28 21:16:37
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论