Oracle 12c新特性:多租户中使用 CONTAINERS 语句跨越PDB查询

 

在OracleDatabase12.1.0.2中,新特性提供了PDBContainers子句,用以从CDB$ROOT层面直接聚合查询多个PDB中同一张表的数据。...


张乐奕
云和恩墨副总经理,Oracle ACE总监,ACOUG 联合创始人


在最新版本的 Oracle Database 12.1.0.2 中,新特性提供了 PDB Containers 子句,用以从 CDB$ROOT 层面直接聚合查询多个 PDB 中同一张表的数据。在新特性文档中该段如下描述:



但是实现起来并非看上去如此简单。

现有测试环境如下:当前 CDB 中有 2 个 PDB,分别是 PDB1 和 PDB2;每个 PDB 中都有一个相同名字的 Local User,为 KAMUS;每个 KAMUS 用户下都有一个 TT 表,表结构相同,数据不同。

首先按照想象,在 CDB$ROOT 中直接使用 SYS 用户查询,会报 ORA-00942 错误。
这要求我们首先创建一个 Common User。并赋予其足够的权限。赋予 select any table 权限是为了方便测试,在真实环境中你可能需要更精细地规划权限。
其次要求用 Common User 分别连接所有需要聚合查询的 PDB,在其中创建一个与表名字相同的视图。
然后还需要在 Common User 中创建一个相同名字的空表,否则查询仍然会报 ORA-00942 错误。
只需要创建一个名字相同的表,已经可以聚合查询 count(*)了。但是如果在 SQL 语句中涉及到特定列仍会有问题。从报错中透露的 P000 进程,可知 Oracle 在实现此过程中使用了并行查询,不同的并行子进程在不同的 PDB 中查询相关表,最后在 CDB 级别中的汇总显示。
因此可以将所有期望聚合查询的列都加入到 C##KAMUS 用户的TT表中,此处增加了 OBJECT_NAME 字段,可以看到特意在测试中增加了 number 类型的 OBJECT_NAME 字段,而 PDB 中的 OBJECT_NAME 字段均为 varchar2 类型,因此可见只需列名称相同即可,无需类型相同。
从以上已经看出,如果更简单,那么在 C##KAMUS 中创建一个与 PDB 中 KAMUS.TT 表完全相同结构的空表即可。这里用 impdp 来实现。
查看执行计划,在执行计划中已经完全没有显示最终表的名称,而是出现 X$CDBVW$ 这样的 FIXED TABLE 名称,在 CDB 中的执行计划将很难判断真实的执行路径。
结论:操作起来稍显复杂,功能正常。
如何加入"云和恩墨大讲堂"微信群
搜索 盖国强(Eygle)微信号:eeygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。
近期文章


如约而至 | 云和恩墨大讲堂电子期刊第五期

删繁就简-云和恩墨的一道面试题解析

用SQL解一道数学题:Gauss和Poincare

2015 Oracle 十大热门文章精选

Oracle 12c ASM 防火防盗新特性揭秘

DBA入门之路:学习与进阶之经验谈
资源下载
关注本微信(OraNews)回复关键字获取

2016YHEMSZ,云和恩墨大讲堂深圳交流会;

2016GOPSZ,2016深圳全球运维大会PPT;

DBALife,"DBA的一天"精品海报大图;

12cArch,“Oracle 12c体系结构”精品海报;

DBA01,《Oracle DBA手记》第一本下载;

YunHe,“云和恩墨大讲堂”案例文档下载;


    关注 Oracle


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册