在之前的博客,我们了解了Oracle Sharding 的概念和环境搭建,如下:

本篇我们继续学习Sharding中的对象。

1 分片表(Shard Table)

分片表是通过分区技术分成更小、更好管理分片的表。Oracle Sharding是基于Oracle数据库分区特性实现的。Oracle分片本质上是分布式分区,它通过支持跨分片的表分区分布来扩展分区。分区根据分片键来分布到SDB中的各个分片的表空间中。

分片键支持如下数据类型:NUMBER / INTEGER / SMALLINT / RAW / (N)VARCHAR / (N)CHAR / DATE / TIMESTAMP。

分片表的每个分区都存储在单独的表空间中,并且每个表空间都和一个特定的分片相关联。这种分片表对于应用来说是完全透明的,和操作普通的分区表没有任何区别。

以下SQL是通过user_id作为分片键创建分片表的示例。在执行DDL语句之前要先启用 shard DDL(alter session enable shard ddl),然后使用分片用户来执行SQL。

CREATE SHARDED TABLE cndba

( user_id NUMBER NOT NULL

, name VARCHAR2(50)

, address VARCHAR2(250)

, created_date DATE

CONSTRAINT cust_pk PRIMARY KEY(user_id)

)

PARTITION BY CONSISTENT HASH (user_id)

PARTITIONS AUTO

TABLESPACE SET data1;

上表是通过一致性哈希来进行分区,这种分区方式可自动跨分片传输表空间,从而来提供数据和负载的均匀分布。注意这里支持本地索引,不支持分片表上的全局索引。

这里有两个相关的概念, 先简单了解一下,后面会进一步说明:

1) 表空间集:Sharding将多个表空间作为一个逻辑单元来创建并管理称为表空间集。 PARTITIONS AUTO表示由Oracle来决定分区数量。这种类型的哈希分区对分片之间迁移数据提供了很大的灵活性和更高的效率。

表空间是SDB中数据分布的逻辑单元。通过在不同分片的表空间中自动创建分区可以实现跨分片的分区分布。为了最小化多个分片之间的连接查询,相关表的相应分区总是存储在同一个分片中。分片表的每个分区存储在不同的表空间中。

2) 块:分片之间的数据移动的单位是块。块是一组表空间,用于存储table family中所有表的相应分区。块包含来自一组相关表的每个表的单个分区。这样就可以一次性移动不同分片表的相关数据。创建SDB时,需要指定每个分片中块的数量。https://www.cndba.cn/dave/article/3760

2 表家族(Table Family)

表家族是一组以相同方式分片的分片表。通常情况下,表之间存在父子关系,子表的外键引用父表的主键。通过这种关系连接的多个表形成树状结构,其中每个子节点都有单个父节点。在一个表家族中没有父节点的表称为根表(root table)。表家族中只能有一个根表。但截至到目前的18c版本,SDB只支持一个表家族。

https://www.cndba.cn/dave/article/3760

创建分片表家族的推荐方法是使用参考分区指定表之间的父子关系。看以下示例,首先通过CREATE TABLE语句来创建表家族中的根表: students。

https://www.cndba.cn/dave/article/3760

https://www.cndba.cn/dave/article/3760

以分片用户连接,并启用shard DDL:

SQL> conn shard_user/oracle

Connected.

SQL> alter session enable shard ddl;

Session altered.

创建表空间集:

SQL> CREATE TABLESPACE SET data1;

Tablespace created.

创建表:

CREATE SHARDED TABLE students

( StuNo NUMBER NOT NULL

, Name VARCHAR2(50)

, Sex VARCHAR2(20)

, class VARCHAR2(50)

, CONSTRAINT NoPK PRIMARY KEY(StuNo)

)

PARTITION BY CONSISTENT HASH (StuNo)

PARTITIONS AUTO

TABLESPACE SET data1;

下面再创建course表和score表,分别是students表的子表,重子表:

CREATE SHARDED TABLE course

( CourseNo NUMBER NOT NULL

, StuNo NUMBER NOT NULL

, CONSTRAINT OrderPK PRIMARY KEY (StuNo, CourseNo)

, CONSTRAINT StuFK FOREIGN KEY (StuNo) REFERENCES students(StuNo)

)

PARTITION BY REFERENCE (StuFK);

CREATE SHARDED TABLE score

( ScoreNo NUMBER NOT NULL

, CourseNo NUMBER(2) NOT NULL

, StuNo NUMBER(5) NOT NULL

, score NUMBER(4)

, CONSTRAINT LinePK PRIMARY KEY (StuNo, CourseNo, ScoreNo)

, CONSTRAINT LineFK FOREIGN KEY (StuNo, CourseNo) REFERENCES Orders(StuNo, CourseNo)

)

PARTITION BY REFERENCE (LineFK);

上面表家族中的三张表,都会存储data1表空间中,默认和根表存放的表空间一样(继承根表的存储属性),当然也可以指定不同的表空间。

三张表中都存在分片键StuNo,通常情况下参考分区(reference partitioning)不需要在子表中创建分片键列。但是由于参考分区需要父表中的主键,用来约束子表和父表的主外键关系,因此主键要么是分片键,或者是分片键中的前导列(leading column)。这样才可以确保数据的唯一性。

另外从建表的SQL语句看,只为students表指定了分区方案,而其他两个表都没有指定分区方案。因为在表家族中,其他两个表会随着的根表的分区变化而变化,例如根表新增了一个分区,那么其他两个子表会自动增加一个分区。

总之,在SDB中使用参考分区表需要满足以下要求:

分片表上的主键必须与分片键相同,或者与分片键中前导列相同。这是保证全局唯一性的必要条件。

引用分区需要父表中的主键,因为必须在子表的外键约束中指定父表的主键。

https://www.cndba.cn/dave/article/3760

在某些情况下,主外键约束对于应用来说比较麻烦,因此Oracle允许在每个表的创建SQL语句中指定PARENT来创建表家族,从而不需要指定主外键约束。例如:

CREATE SHARDED TABLE students

( StuNo NUMBER NOT NULL

, Name VARCHAR2(50)

, Sex VARCHAR2(20)

, class VARCHAR2(50)

)

PARTITION BY CONSISTENT HASH (StuNo)

PARTITIONS AUTO

TABLESPACE SET data1;

CREATE SHARDED TABLE course

( CourseNo NUMBER NOT NULL

, StuNo NUMBER NOT NULL

)

PARENT students

PARTITION BY CONSISTENT HASH (StuNo)

PARTITIONS AUTO

TABLESPACE SET data1;

CREATE SHARDED TABLE score

( ScoreNo NUMBER NOT NULL

, CourseNo NUMBER(2) NOT NULL

, StuNo NUMBER(5) NOT NULL

, score NUMBER(4)

)

PARENT students

PARTITION BY CONSISTENT HASH (StuNo)

PARTITIONS AUTO

TABLESPACE SET data1;

以上SQL语句不仅去掉了主外键约束,而且每个表都有自己的分区策略和存放的表空间集。但是这种方法只支持两级表家族,也就是父表-子表(所有子表都有同一个父表),没有重子表。

3 复制表(Duplicated Tables)

除了分片表之外,SDB中还可以在所有分片上存储复制表,这里所谓的复制表,就是每个分片上的数据都是一样的。复制表适用与数量小,只读且读取频繁的表,这样可以最大化单个分片处理的数据库请求数。例如某些数据字典表,数据量很小并且不适合分片。这样在每个分片上都存储完整的数据,可以在单个分片上完成一个查询。

3.1 创建复制表

创建复制表的方法很简单,在CREATE TABLE语句中指定关键字DUPLICATED即可。

https://www.cndba.cn/dave/article/3760https://www.cndba.cn/dave/article/3760

CREATE DUPLICATED TABLE courseinfo

(CourseNo NUMBER PRIMARY KEY

, Name VARCHAR2(20)

, Grade VARCHAR2(20));

3.2 更新复制表并同步数据

Oracle Sharding使用物化视图复制来同步复制表中的数据。每个分片上的复制表实际上是物化视图,物化视图的基表存储在分片目录数据库中。 CREATE DUPLICATED TABLE语句自动创建所需的基表,物化视图和其他对象。

在Oracle 12c R2中只能在分片目录数据库中更新复制表。而到了Oracle 18c,也可以在分片上执行更新操作。首先将更新的内容传输到分片目录中的主表中,然后再更新到其他分片中。

所有分片上的物化视图可以配置刷新频率来实现自动刷新。所有复制表的刷新频率由初始化参数SHRD_DUPL_TABLE_REFRESH_RATE控制。该参数的默认值是60秒。

3.3 创建非表(Non-Table)的对象

除了表之外,其他对象(例如用户,角色,视图,索引,同义词,函数,存储过程)和包以及非模式数据库对象(例如表空间,表空间集,directory和context)都可以在分片上创建。https://www.cndba.cn/dave/article/3760

以下对象目前不支持自动在所有分片上创建,但是可以分别在分片中单独进行创建:

Cluster

Control file

Database link

Disk group

Edition

Flashback archive

Materialized zone map

Outline

Pfile

Profile

Restore point

Rollback segment

Summary

4 块(Chunk)

块的概念和表家族密不可分。因为表家族之间的各个表都是有关系的,我们把某个表家族的一组分区称作一个 块。https://www.cndba.cn/dave/article/3760

因为表家族中的每个表都可以有自己的表空间集,比如表CNDBA的表空间集是TS1,表Users的表空间集是TS2,为了保证表家族中CNDBA表P1分区对应的表空间和Users表P1分区对应表空间存放在同一个分片上,引入了块的概念,块就是表家族中所有表对应分区的集合,这样可以相应的分区都在同一个分片中,避免了跨分片的链接查询。在进行re-sharding 的时候,是以块为单位进行移动。

下面通过一个图来说明SDB中各个组件之间的对应关系。

SDB是由多个分片(独立的数据库)组成,每个分片是由一个或多个块组成,每个块是由多个表空间组成,表空间也是由多个表分区组成。这里注意表空间和表分区之间的关系,同一个表的不同分区一定是存储在不同的表空间中。

块就是由一组分区组成的,如下图:每个块包含了不同表的分区。

每个分片包含多个块,如下图:

版权声明:本文为博主原创文章,未经博主允许不得转载。

ORACLE18C具有什么特性,Oracle 18c 必须掌握的新特性 Sharding系列(3) -- Sharding对象说明...相关推荐

  1. 开工大吉:Oracle 18c已经发布及新特性介绍

    在2018的新年(据2月16日文章),Oracle宣布Database 18c已经发布,但是仍然是首先在Oracle Cloud上一体机环境发布出来.所以要等到常规版本的公开提供,还有一段时间要等. ...

  2. oracle19c的版本号_Oracle Database 20c/19c/18c/12c发布的新特性介绍

    在介绍Oracle Database 20c新特性时,首先回顾一个关于Oracle12c,oracle18c, oracle19c一些重要的特性: 1.Oracle Database 12c: Mul ...

  3. 深入解析 | Oracle Database 20c 十大新特性一览

    在2020年2月14日,Oracle 正式宣布在 Oracle Cloud 发布 Database 20c 的预览版,同时发布了所有的官方文档. 为了和大家及时分享关于 Oracle 20c 引人瞩目 ...

  4. atitit.Oracle 9 10 11 12新特性attilax总结

    atitit.Oracle 9  10 11  12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1.   审计简介 1 1.4. ...

  5. 今天聊聊Oracle Database 21c 十“小”新特性

    墨墨导读:Oracle Database 21c 已经在云上提供,线下版本将于2021年上半年提供,这标志着 Oracle 进入了下一个版本周期的创新发布. 关于 Oracle 21c 其实就相当于 ...

  6. 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性

    2020年数据技术嘉年华还有两周多的时间,相信大家期待值也越来越高.数据技术嘉年华组委会在此精心为大家准备了"嘉年华回顾",挑选往届大会中热门的演讲.小编带大家回顾往届的高光时刻! ...

  7. Oracle Database 20c 十大新特性一览

    从大会的分享和公布的资料中,我们整理了其中重要的新特性,汇聚成10个方向,按照惯例,和大家分享. 历史回顾: Oracle Database 20c 新特性: 1.原生的区块链支持 - Native ...

  8. Oracle 11.2.0.2新特性——用户重命名(Rename User)

    11.2.0.2里新增了一个很有意思的新特性--用户重命名(Rename User),以前俺们都是Rename datafile呀,tablespace呀,Index呀,抑或是constraint之类 ...

  9. oracle 峰度 函数,Oracle Database 21c 十大新特性一览

    摘要:Oracle 考虑到 2020 年我们的客户将面临前所未有的经济和业务中断.我们决定不将 Database 20c Preview 版本升级为 General Availability. 相反, ...

最新文章

  1. 使用OpenCV进行直播(附代码)
  2. hdu1085Holding Bin-Laden Captive!组合问题
  3. appium---【Mac】Appium-Doctor提示WARN:“ ios_webkit_debug_proxy cannot be found”解决方案...
  4. Kudu Tablet design
  5. Java集合(八) 迭代器Iterator、泛型、Map映射
  6. 别熬夜加班了,Facebook 开源了一款代码推荐神器!| 程序员硬核评测
  7. 删除HTML标签的正则表达式
  8. 中国住户收入调查(CHIP)数据及问卷(1988-2008年)
  9. 小米路由器3是基于linux,小米路由器3(MI-3)刷华硕固件不用虚拟机刷华硕固件无需虚拟机方法...
  10. 台湾普瑞Parade PS8625| PS8625芯片方案|EDP转LVDS方案| 替代与兼容PS8625
  11. MSP430G2-LaunchPad简明教程03[创建一个MSP430工程]
  12. Android 九宫格物理键盘数字英文切换
  13. XV6 RISCV 源码阅读报告之 进程调度
  14. 有哪些好用的在线电影影视导航网站
  15. MTK笔试面试题集锦
  16. 视频教程-Web前端开发利器 SPRY框架之表单验证-JavaScript
  17. Bean对象的拷贝方法BeanCopier和BeanUtils
  18. nyoj82(迷宫寻宝)
  19. MySQL 爱生活群开放加入喽
  20. 利用百度地图sdk实现定位

热门文章

  1. 思想决定高度,行动决定宽度
  2. SAP 科目类型为“初级成本和收入”时,录入会计凭证时不输入成本中心
  3. Python爬虫爬取各大热门短视频平台视频
  4. 全阶滑模观测器程序_基于全阶状态滑模观测器的混合永磁记忆电机磁链观测
  5. R语言使用choose函数计算排列组合:组合数(输入两个参数、combination)
  6. [c#winform] ToolStrip\Button\Lable 等控件修改高度的解决方案
  7. 【学神】 1-9 硬盘分区及挂载
  8. [Maven] resource配制include与exclude的关系
  9. 订单审核业务流程泳道图
  10. 思科网络安全 第八章考试答案