Oracle 12c新特性:多租户中使用 CONTAINERS 语句跨越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 中的执行计划将很难判断真实的执行路径。

结论:操作起来稍显复杂,功能正常。

文章转自数据和云公众号,原文链接

时间: 2024-10-31 16:37:12

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

《Oracle数据库管理与维护实战》——1.3 Oracle 12c新特性

1.3 Oracle 12c新特性 Oracle数据库管理与维护实战 纵观甲骨文全球大会和甲骨文公司的各种资讯,我们可以发现云计算和大数据是两个重要的主题,Oracle 12c则融合了这两大主题.与以往的Oracle数据库相比,Oracle 12c在16个方面进行了更新.本节将详细介绍Oracle 12c数据库中的16个新特性. 1.3.1 支持多线程模式 在Oracle 12c中,Oracle引入了多线程模式,允许在Windows平台之外的UNIX.Linux等系统使用多线程模式.结合多进程与

软件大会分享PPT:面向开发和DBA的Oracle 12c新特性

在2016年12月10日的『中国软件大会上』,我分享了一个主题:<面向开发人员和DBA的Oracle 12c新特性>,从安全的主题开始,以在线变更为主线,分享了Oracle 12c的一些新特性,尤其是12.2的部分新特性. 在这个主题中,12.2 的 lockdown profile 成为我的出发点,通过这一新的安全机制,Oracle 12c 的PDB权限得以被限制,可以防范PDB的高权限操作对全局产生影响. 而在12.2中PDB的Clone,可以在线进行,这是较12.1的又一大进步: Ora

ORACLE 12C新特性——CDB与PDB

Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB).CDB全称为Container Database,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库.在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载.而实例与数据库不可

Oracle 12c 新SQL提示(hint)

Oracle 12c 新SQL提示(hint) Oracle 12c中引入了许多新特性,其中部分是和SQL相关的特性.而一些新的SQL提示也随着这些新特性被引入. enable_parallel_dml Syntax: enable_parallel_dml Description: Enable parallel dml. Same effect as "alter session enable parallel dml" SQL?? HelloDBA.com> create 

[20131212]12c新特性建表 属性DEFAULT ON NULL.txt

[20131212]12c新特性建表 属性DEFAULT ON NULL.txt 在12c上建立表可以让插入NULL等于某个特定的值.举一个例子: SCOTT@ztest> @verBANNER                                                                               CON_ID--------------------------------------------------------------------

12c新特性:Last Successful login time

[20150920]12c新特性:Last Successful login time.txt --12c有一个新特性,就是使用sqlplus登录时,会提示最后成功的登录时间.Last Successful login time. --起始这个不算什么特性,我个人想了解这个时间是从那里得来的. sqlplus scott/xxxxxx@test01p SQL*Plus: Release 12.1.0.1.0 Production on Sun Sep 20 17:54:37 2015 Copyr

[20130915]12c新特性 varchar2支持32K长度.txt

[20130915]12c新特性 varchar2支持32K长度.txt oracle 12c以前如果字符串长度超过4000,必须使用blob或者clob类型.12c开始支持超过4000的字符串长度,提高一些应用的灵活性,达到32K,避免一些字段定义为clob,blob类型,提高处理能力. 但是12c默认的方式不支持大于4000的字符串长度,必须经过一些步骤升级完成,自己测试如下: SYS@test> @ver BANNER                                    

[20130808]12c新特性Temporary undo.txt

[20130808]12c新特性Temporary undo.txt 12C提供特性临时表执行dml时生成的undo保存在临时表空间,这个特性叫Temporary Undo,由数据库参数temp_undo_enabled控制,有两个优点:     1.很明显减少redo在临时表做dml操作时.    2.允许在physical standby database上对临时表执行dml操作.(没有环境无法测试) 测试: SQL> @ver BANNER                         

[20131121]12c新特性Session sequences.txt

[20131121]12c新特性Session sequences.txt http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_6016.htm SESSION Specify SESSION to create a session sequence, which is a special type of sequence that is specifically designedto be used with glo