本記事の目的
Oracle Database Administration (oracle Gold)の学習がメインである。
個人的に理解するのにわかりにくかったところを記事としてまとめた。
前提
- CDBルートのテーブルには、原則データは入っていない
→CDBルートは、PDBを動かすことが役割だから
目次
- CDBで使用するContainers句とは
- アプリケーションコンテナ限定機能 コンテナマップってナニモノ?
- まとめ
1. CDBで使用するContainers句とは
図1のように、共通ユーザが各PDBに同じテーブル名・同じ定義のテーブルがあったとする。
クライアントは、CDBルートへアクセス
→アクセス後図2で示しているように、Containers句で対象の共通ユーザのテーブルに向けてクエリを投げると。。。
図2のようにアクセスできる
Select * from Containers(C##test.Countries)
図3のように、すべてのPDBにアクセス、すべてのPDBのデータを取得することができる!
内部的には、Union Allと同様の処理を行っている。
図3
また、図4を見てほしい。
where句でcon_idを指定することで指定したPDBにのみアクセス
→アクセスしたPDBのデータのみを取得することができる
(con_idは、コンテナを識別するためにコンテナ作成時に、oracleが内部的に作成する値)
図4
2. アプリケーションコンテナ限定機能 コンテナマップってナニモノ?
まず、アプリケーションコンテナは、どういったものかを図5に示した。
CDBにアプリケーションコンテナがぶら下がっている、その下に、各PDBがぶら下がっているイメージ。
図5
コンテナマップとは、、、
Containers句の強化版
→どのPDBにどのデータが入っているかをマッピングしているテーブル
具体的にCreate Talble
文で、マッピングテーブルを作成後、以下を実行してコンテナマップを有効化することで使用可能になる。
Alter Pluggable Database Set Container_MAP ='<マップ名>'
イメージとしては、図6に示した。
アプリケーションルート上で、
新規でPDBとデータが対応する表を作成する。
→正確には、パーティションテーブル。下記の2種類から選択して作成できる。
コンテナマップを作成すると、図7のようにアプリケーションルートに格納される。
今回は、レンジパーティションを想定した図になっている。
-
レンジパーティション
→対象データの値を範囲で分割するパーティション -
リストパーティション
→対象データを一つ一つリスト化して実施するパーティション
さて、ここで実際にSQLを実行した内部動作イメージを図8、図9を見ながらイメージしてほしい。
まずは、図8について 以下のSQLを発行する。
select * from Countries;
今回は、where句で条件を指定していないのですべてのコンテナにアクセスする。
次に図9である。
select * from Countries where region_id=001;
まずは、条件にマッチするコンテナはどこに当たるのかをコンテナマップで確認する
→対象のコンテナにのみ、データを見に行く
※以下の設定を行うことで、対象の表についてContainers句を省略できる
Alter Table <テーブル名> Enable Containers_Default;
3.まとめ
- CDBルートにアクセスすることで
Containers
句を使用することができる - CDBルートへは、共通ユーザでアクセスする
-
Containers
句を使用することで、すべてのPDBに対して一括データアクセスが可能 - コンテナマップは、アプリケーションコンテナ専用の機能である
- コンテナマップを使用する際は、アプリケーションルートに共通ユーザでアクセスする必要がある
- コンテナマップを使用することで、
where
の条件指定をcon_id
以外でできる