最近遇在干个核心的金融项目,规模很大,客户主要是用oracle数据库,现在需要适配ob,原来在oracle就是分区表的迁来ob以后需要进行改造。

oracle默认使用是堆表(ht),而ob使用的是索引组织表(iot),表原理不一样所以分区表会稍微有点区别。


1、表无主键,创建范围分区表

CREATE TABLE sales_orders (
order_id INT,
customer_id INT,
order_date DATE,
total_amount DECIMAL(10, 2)
)
PARTITION BY RANGE(order_date)
( PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
, PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
, PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
, PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
, PARTITION MMAX VALUES LESS THAN (MAXVALUE));

表在无主键情况下创建分区表,只需要提前确认好分区列,分区列的类型,分区规则就行。

由于历史原因,以前很多用堆表的业务都是没有使用主键的,业务涉及没有严格使用三范式,如果此类无主键的表迁移到ob数据库的话,ob也会建议创建上必要的主键索引。

如果业务无法找到合适的列创建主键索引,上面sql 也可以兼容oracle,在ob_oracle 租户可以直接创建成功。


2、表有主键,创建范围分区表

但是表有主键的情况下,情况会稍微复杂点,oracle由于是堆表可以按照以下方式创建分区表,主键和分区键之间可以没有关联

CREATE TABLE sales_orders (
order_id INT, -- 订单号
customer_id INT,
order_date DATE, -- 订单日期
total_amount DECIMAL(10, 2),
PRIMARY KEY(order_id)
)
PARTITION BY RANGE(order_date) -- 使用订单日期进行分区
( PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
, PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
, PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
, PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
, PARTITION MMAX VALUES LESS THAN (MAXVALUE)
);

但是在ob里面,如果需要创建带有主键的分区表,分区列必须是主键列的一部分。

参考官方文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000820771

如果 ob_oracle 创建分区表使用单独的列会报错:ORA-00600: internal error code, arguments: -5261, A PRIMARY KEY must include all columns in the table's partitioning function

ob_oracle 正确创建分区表方式:

CREATE TABLE sales_orders (
order_id INT, -- 订单号
customer_id INT,
order_date DATE, -- 订单日期
total_amount DECIMAL(10, 2),
PRIMARY KEY(order_id,order_date) -- 联合主键
)
PARTITION BY RANGE(order_date) -- order_date 是主键一部分,使用订单日期进行分区
( PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD'))
, PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD'))
, PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD'))
, PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD'))
, PARTITION MMAX VALUES LESS THAN (MAXVALUE)
);

但是这样会有一个问题,就是原来oracle上order_id 是主键,现在在ob以后是order_id,order_date成为组合索引。

如果业务代码层面没有做数据校验的逻辑,会在order_id上产生重复数据,这样不合符原有的业务逻辑

其实很简单,只需要对order_id加个唯一索引即可实现在oracle上一样的逻辑。

CREATE unique index idx_uniq_order_id on sales_orders(order_id);

这样一来,order_id就不会出现重复数据了,而且ob分区表的逻辑也能和oracle 对得上。

OceaBase 分区表创建技巧的更多相关文章

  1. Hive分区表创建、分类

    一.分区表创建与说明 必须在表定义时创建partition a.单分区建表语句:create table day_table (id int, content string) partitioned ...

  2. postgresql 分区表创建及测试

    1      建立分区 1.1.  创建主表 CREATE TABLE measurement ( city_id         int not null, logdate        date ...

  3. SQL Server 2005 分区表创建实例

    --创建一个分区函数(默认为左边界)CREATE PARTITION FUNCTION PARTFUNC1(INT)AS RANGEFOR VALUES(1000,2000,3000,4000,500 ...

  4. oracle 11g 分区表创建(自动按年、月、日分区)

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性. oracle 11g 支持自动分区,不 ...

  5. Hive分区表创建,增加及删除

    1.创建Hive分区表,按字段分区 CREATE TABLE test1 ( id bigint , create_time timestamp , user_id string) partition ...

  6. Sqlserver大数据量分区表创建

    /* 逆向删除对象 DROP PARTITION SCHEME [PS_BasicPolicy2014]; DROP PARTITION FUNCTION [PF_BasicPolicy2014]; ...

  7. 创建分区表和查看分区表的Metadata

    未分区的表,只能存储在一个FileGroup中:对table进行分区后,每一个分区都存储在一个FileGroup中.表分区是将逻辑上一个完整的表,按照特定的字段拆分成Partition set,分散到 ...

  8. SQL Server ->> 分区表上创建唯一分区索引

    今天在读<Oracle高级SQL编程>这本书的时候,在关于Oracle的全局索引的章节里面有一段讲到如果对一张分区表创建一条唯一索引,而索引本身也是分区的,那就必须把分区列也加入到索引列表 ...

  9. oracle按时间创建分区表

    首先明确分区表和表分区的区别:表分区是一种思想,分区表示一种技术实现.当表的大小过G的时候可以考虑进行表分区,提高查询效率,均衡IO.oracle分区表是oracle数据库提供的一种表分区的实现形式. ...

  10. oracle 分区表和分区索引

    很复杂的样子,自己都没有看完,以备后用 http://hi.baidu.com/jsshm/item/cbfed8491d3863ee1e19bc3e ORACLE分区表.分区索引ORACLE对于分区 ...

随机推荐

  1. 第十九篇:Django ORM外键关联关系

    一.一对多的创建 二.一对多跨表操作 三.创建多对多 四.Ajax处识 五.模板继承与导入 六.自定义分页

  2. C#/.NET/.NET Core拾遗补漏合集(24年4月更新)

    前言 在这个快速发展的技术世界中,时常会有一些重要的知识点.信息或细节被忽略或遗漏.<C#/.NET/.NET Core拾遗补漏>专栏我们将探讨一些可能被忽略或遗漏的重要知识点.信息或细节 ...

  3. 将 Github Pages 个人博客录入搜索引擎(以 Bing 为例)

    目录 关于 Bing Webmaster Tools 步骤一:登录 步骤二:添加网站 步骤三:验证网站 步骤四:添加网站地图 验证 & 总结 相关链接 笔者最近准备将 Gitee Pages ...

  4. 重新整理.net core 计1400篇[十] (.net core 中的依赖注入的服务的生命周期)

    前言 首先我们知道一个东西,那就是生命周期和timelife 的配置有关. 正文 首先看下IServiceProvider的数据结构: 其数据结构是一颗树: 我是一个抽象画家,红色部分是IServic ...

  5. 剑指offer39(Java)-数组中出现次数超过一半的数字(简单)

    题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...

  6. eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术

    ​简介:如何使用 socket eBPF进一步提升Service 网络的转发性能? ​ 背景介绍 Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成.其中 ...

  7. Flink 和 Pulsar 的批流融合

    简介: 如何通过 Apache Pulsar 原生的存储计算分离的架构提供批流融合的基础,以及 Apache Pulsar 如何与 Flink 结合,实现批流一体的计算. 简介:StreamNativ ...

  8. [FAQ] WPS 服务程序是一种流氓软件吗

    是的,周而复始的后台进程,频率大致是每隔一个小时会运行一个购物车图标的后台程序,点击之后就会打开电商网站,随后这个程序消失.再出现. 当前时间:2021-10-29 Other:[FAQ] 你所看过的 ...

  9. jqGrid--设置单元格字体颜色

    colModel: [ { name: '列名称', index: '列名称', width: 65, sortable: true, resizable: false, cellattr: addC ...

  10. Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景

    当在 Spring Boot 应用程序中使用Spring Data JPA 进行数据库操作时,配置Schema名称是一种常见的做法.然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生 ...