【Oracle Database 12c New Feature】Aggregate Data Ac
在最新版本的Oracle Database 12.1.0.2中,新特性提供了PDB Containers子句,用以从CDB$ROOT层面直接聚合查询多个PDB中同一张表的数据。在新特性文档中该段如下描述: 但是实现起来并非看上去如此简单。 现有测试环境如下: 当前CDB中有2个PDB,分别是PDB1和
在最新版本的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错误。
SQL> SHOW USER USER IS "SYS" SQL> SHOW con_name CON_NAME ------------------------------ CDB$ROOT SQL> SELECT COUNT(*) FROM CONTAINERS(KAMUS.TT) WHERE CON_ID IN (3); SELECT COUNT(*) FROM CONTAINERS(KAMUS.TT) WHERE CON_ID IN (3) * ERROR at line 1: ORA-00942: TABLE OR VIEW does NOT exist
- 这要求我们首先创建一个Common User。并赋予其足够的权限。赋予select any table权限是为了方便测试,在真实环境中你可能需要更精细地规划权限。
SQL> CREATE USER C##KAMUS IDENTIFIED BY oracle DEFAULT tablespace users; USER created. SQL> GRANT dba TO C##KAMUS CONTAINER=ALL; GRANT succeeded. SQL> GRANT SELECT any TABLE TO C##KAMUS CONTAINER=ALL; GRANT succeeded.
- 其次要求用Common User分别连接所有需要聚合查询的PDB,在其中创建一个与表名字相同的视图。
sqlplus "C##KAMUS/oracle@db-cluster-scan:1521/pdb1" CREATE OR REPLACE VIEW tt AS SELECT * FROM kamus.tt; ALTER SESSION SET container=pdb2; CREATE OR REPLACE VIEW tt AS SELECT * FROM kamus.tt;
- 然后还需要在Common User中创建一个相同名字的空表,否则查询仍然会报ORA-00942错误。
SQL> SHOW USER USER IS "C##KAMUS" SQL> SHOW con_name CON_NAME ------------------------------ CDB$ROOT SQL> CREATE TABLE TT (dummy CHAR(1)); TABLE created. SQL> SELECT COUNT(*) FROM CONTAINERS(TT); COUNT(*) ---------- 117362
- 只需要创建一个名字相同的表,已经可以聚合查询count(*)了。但是如果在SQL语句中涉及到特定列仍会有问题。从报错中透露的P000进程,可知Oracle在实现此过程中使用了并行查询,不同的并行子进程在不同的PDB中查询相关表,最后在CDB级别中的汇总显示。
SQL> SELECT OBJECT_NAME FROM CONTAINERS(TT) WHERE rownum<11; SELECT OBJECT_NAME FROM CONTAINERS(TT) WHERE rownum<11 * ERROR at line 1: ORA-12801: error signaled IN parallel query server P000, instance dbserver1.vbox.com:cdb12c_1 (1) ORA-00904: "OBJECT_NAME": invalid identifier SQL> SELECT COUNT(*) FROM CONTAINERS(TT) WHERE OBJECT_NAME='XX'; SELECT COUNT(*) FROM CONTAINERS(TT) WHERE OBJECT_NAME='XX' * ERROR at line 1: ORA-12801: error signaled IN parallel query server P000, instance dbserver1.vbox.com:cdb12c_1 (1) ORA-00904: "OBJECT_NAME": invalid identifier
- 因此可以将所有期望聚合查询的列都加入到C##KAMUS用户的TT表中,此处增加了OBJECT_NAME字段,可以看到特意在测试中增加了number类型的OBJECT_NAME字段,而PDB中的OBJECT_NAME字段均为varchar2类型,因此可见只需列名称相同即可,无需类型相同。
SQL> ALTER TABLE TT ADD OBJECT_NAME NUMBER(10); TABLE altered. SQL> SELECT OBJECT_NAME FROM CONTAINERS(TT) WHERE rownum<11; OBJECT_NAME ------------------------------------ ICOL$ I_CDEF3 TS$ CDEF$ I_FILE2 I_OBJ5 I_OBJ1 I_OBJ4 I_USER2 I_COL2 10 ROWS selected. SQL> SELECT COUNT(*) FROM CONTAINERS(TT) WHERE OBJECT_NAME LIKE 'ICOL%'; COUNT(*) ---------- 12
- 从以上已经看出,如果更简单,那么在C##KAMUS中创建一个与PDB中KAMUS.TT表完全相同结构的空表即可。这里用impdp来实现。
impdp C##KAMUS/oracle@db-cluster-scan:1521/cdb12c DIRECTORY=dpump DUMPFILE=expdat.dmp EXCLUDE=TABLE_DATA TABLES=KAMUS.TT REMAP_SCHEMA=KAMUS:C##KAMUS SQL> SHOW con_name CON_NAME ------------------------------ CDB$ROOT SQL> SHOW USER USER IS "C##KAMUS" SQL> SELECT TABLE_NAME FROM tabs; TABLE_NAME ------------------------------ TT SQL> SELECT COUNT(*) FROM TT; COUNT(*) ---------- 0 SQL> SQL> SELECT COUNT(*) FROM CONTAINERS(TT); COUNT(*) ---------- 117386 SQL> SELECT COUNT(*) FROM CONTAINERS(TT) WHERE CON_ID IN (3); COUNT(*) ---------- 58693
- 查看执行计划,在执行计划中已经完全没有显示最终表的名称,而是出现X$CDBVW$这样的FIXED TABLE名称,在CDB中的执行计划将很难判断真实的执行路径。
SQL> SET autot ON SQL> SELECT COUNT(*) FROM CONTAINERS(TT); COUNT(*) ---------- 117386 Execution Plan ---------------------------------------------------------- Plan hash VALUE: 3954817379 --------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | ROWS | Cost (%CPU)| TIME | Pstart| Pstop | TQ |IN-OUT| PQ Distrib | --------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 1 (100)| 00:00:01 | | | | | | | 1 | SORT AGGREGATE | | 1 | | | | | | | | | 2 | PX COORDINATOR | | | | | | | | | | | 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | | | Q1,00 | P->S | QC (RAND) | | 4 | SORT AGGREGATE | | 1 | | | | | Q1,00 | PCWP | | | 5 | PX PARTITION LIST ALL| | 58693 | 1 (100)| 00:00:01 | 1 | 254 | Q1,00 | PCWC | | | 6 | FIXED TABLE FULL | X$CDBVW$ | 58693 | 1 (100)| 00:00:01 | | | Q1,00 | PCWP | | --------------------------------------------------------------------------------------------------------------------------- Statistics ---------------------------------------------------------- 117574 recursive calls 0 db block gets 58796 consistent gets 0 physical reads 124 redo SIZE 544 bytes sent via SQL*Net TO client 551 bytes received via SQL*Net FROM client 2 SQL*Net roundtrips TO/FROM client 13 sorts (memory) 0 sorts (disk) 1 ROWS processed
结论: 操作起来稍显复杂,功能正常。
Share/Save
Related posts:
- How to resolve ORA-24005 when drop tablespace
- How to Use DBMS_ADVANCED_REWRITE in Oracle 10g
- 【Oracle Database 12c New Feature】How to Learn Oracle (12c New Feature) from Error


Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The key to learning Java without taking detours is: 1. Understand core concepts and grammar; 2. Practice more; 3. Understand memory management and garbage collection; 4. Join online communities; 5. Read other people’s code; 6. Understand common libraries and frameworks; 7. Learn to deal with common mistakes; 8. Make a learning plan and proceed step by step. These methods can help you master Java programming efficiently.

Learning Java requires learning basic syntax, object-oriented programming, collection frameworks, exception handling, multithreading, I/O streaming, JDBC, network programming, and advanced features such as reflection and annotation. 1. The basic syntax includes variables, data types, operators and control flow statements. 2. Object-oriented programming covers classes, objects, inheritance, polymorphism, encapsulation and abstraction. 3. The collection framework involves ArrayList, LinkedList, HashSet, and HashMap. 4. Exception handling ensures program robustness through try-catch block. 5. Multithreaded programming requires understanding of thread life cycle and synchronization. 6. I/O streams are used for data reading, writing and file operations. 7. JDBC is used to interact with databases. 8. Network programming passes S

To connect Oracle database to Tableau for data visualization, you need to follow the following steps: 1. Configure Oracle database connection in Tableau, use ODBC or JDBC drivers; 2. Explore data and create visualizations, such as bar charts, etc.; 3. Optimize SQL queries and indexes to improve performance; 4. Use Oracle's complex data types and functions to implement through custom SQL queries; 5. Create materialized views to improve query speed; 6. Use Tableau's interactive functions such as dashboard for in-depth analysis.

The steps to connect to an Oracle database connection pool using JDBC include: 1) Configure the connection pool, 2) Get the connection from the connection pool, 3) Perform SQL operations, and 4) Close the resources. Use OracleUCP to effectively manage connections and improve performance.

The main reason for integrating Oracle databases with Hadoop is to leverage Oracle's powerful data management and transaction processing capabilities, as well as Hadoop's large-scale data storage and analysis capabilities. The integration methods include: 1. Export data from OracleBigDataConnector to Hadoop; 2. Use ApacheSqoop for data transmission; 3. Read Hadoop data directly through Oracle's external table function; 4. Use OracleGoldenGate to achieve data synchronization.

In Oracle database, the steps to configure parallel query to improve performance include: 1. Set at the database level, and implement it by modifying initialization parameters such as PARALLEL_DEGREE_POLICY and PARALLEL_MAX_SERVERS; 2. Set at the session level, adjust the parallelism of the current session through the ALTERSESSION command; 3. Consider key points such as parallelism, resource management and data distribution; 4. Improve performance by optimizing query planning, adjusting parallelism and monitoring and tuning. These steps help to take full advantage of parallel queries and significantly improve the query performance of the database.

Directly querying administrator passwords is not recommended in terms of security. The security design principle of Oracle database is to avoid storing passwords in plain text. Alternative methods include: 1. Reset the SYS or SYSTEM user password using SQL*Plus; 2. Verify the encrypted password through the DBMS_CRYPTO package.

In Oracle database, if you want to not return the value of a certain field when querying, you can use the following three methods: Only list the required fields in the SELECT statement and do not select the unwanted fields. Create views to simplify queries, but pay attention to the complexity and maintenance costs of the views. Excluding unwanted columns using subqueries or JOINs is suitable for dynamic exclusion of columns, but may affect query performance. Each method has its applicable scenarios and potential disadvantages, and the most suitable method needs to be selected based on specific needs and performance considerations.
