この記事ではコンテナマップについて解説します。
コンテナマップとは
コンテナマップとはアプリケーションコンテナにおいて各アプリケーションPDBにどのデータが格納されているかをマッピングするテーブルです。
アプリケーションルートに作成し、適応するテーブルを指定して有効化することによって使用できます。
コンテナマップを使用することによって、パーティションを使用したときと同じように、必要なアプリケーションPDBのみにアクセスし、効率的に問い合わせを行うことができます。
コンテナマップの使用例
アプリケーションルート「regions」に対してアプリケーションPDB「asia」、「europe」が存在します。
アプリケーションコンテナで「regions」、「countries」の2つの表を共有しています。
各アプリケーションPDBでこれらのテーブルにデータを格納しています。
「asia」には下記のようにデータを格納しています。
SQL> select * from regions_owner.regions;
REGION_ID REGION_NAME
---------- -----------
1 Asia
SQL> select * from regions_owner.countries;
COUNTRY_ID COUNTRY_NAME REGION_ID
----------- ------------ ----------
1 Japan 1
2 China 1
「europe」には下記のようにデータを格納しています。
SQL> select * from regions_owner.regions;
REGION_ID REGION_NAME
---------- -----------
2 Europe
SQL> select * from regions_owner.countries;
COUNTRY_ID COUNTRY_NAME REGION_ID
----------- ------------ ----------
3 Germany 2
4 France 2
このような状態のときにアプリケーションルートからアジアの国を抽出する場合に「asia」PDBへ、ヨーロッパの国を抽出する場合に「europe」PDBに適切にアクセスできるようにコンテナマップを作成します。
コンテナマップの作成方法
コンテナマップは通常のテーブルと同じようにCREATE TABLE文で作成します。
上記の例のコンテナマップを作成する場合は以下のように実行します。
SQL> alter session set container=regions;
Session altered.
SQL> CREATE TABLE regions_owner.maptable(
region_id NUMBER,name VARCHAR2(10))
PARTITION BY LIST (region_id)
(PARTITION asia VALUES (1),
PARTITION europe VALUES (2));
Table created.
パーティション名のところにアプリケーションPDBの名前を指定します。
作成した表がコンテナマップであることを宣言します。
SQL> ALTER DATABASE SET container_map='regions_owner.maptable';
Database altered.
作成したコンテナマップを表と連携するためにアプリケーションのアップグレードを行います。
SQL> ALTER PLUGGABLE DATABASE APPLICATION regions_app BEGIN UPGRADE '1.0' TO '1.1';
Pluggable database altered.
SQL> ALTER TABLE regions_owner.regions ENABLE container_map;
Table altered.
SQL> ALTER TABLE regions_owner.countries ENABLE container_map;
Table altered.
SQL> ALTER TABLE regions_owner.regions ENABLE containers_default;
Table altered.
SQL> ALTER TABLE regions_owner.countries ENABLE containers_default;
Table altered.
SQL> ALTER PLUGGABLE DATABASE APPLICATION regions_app END UPGRADE TO '1.1';
Pluggable database altered.
container_defaultを有効にするとcontainer句を使用せずにアプリケーションルートからデータにアクセスできるようになります。
各アプリケーションPDBでアップグレードを同期したらアプリケーションルートからデータがアクセスできるようになります。
SQL> select * from regions_owner.regions;
REGION_ID REGION_NAME CON_ID
---------- ----------- ----------
1 Asia 7
2 Europe 8
SQL> select * from regions_owner.countries;
COUNTRY_ID COUNTRY_NAME REGION_ID CON_ID
----------- ------------ ---------- ----------
1 Japan 1 7
2 China 1 7
3 Germany 2 8
4 France 2 8
アジアの国のみを検索し、実行計画を確認します。
SQL> select * from regions_owner.countries where region_id=1;
COUNTRY_ID COUNTRY_NAME REGION_ID CON_ID
----------- ------------ ---------- ----------
1 Japan 1 7
2 China 1 7
SQL> select * from table(DBMS_XPLAN.DISPLAY_CURSOR());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------
SQL_ID ackmuj0wck61h, child number 0
-------------------------------------
select * from regions_owner.countries where region_id=1
Plan hash value: 877826017
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| | | |
| 1 | PARTITION LIST SINGLE| | 900 | 81900 | 2 (100)| 00:00:01 | 1 | 1 |
| 2 | CONTAINERS FULL | COUNTRIES | 900 | 81900 | 2 (100)| 00:00:01 | | |
---------------------------------------------------------------------------------------------------
14 rows selected.
実行計画から1つめのPDB(asia)のみにアクセスしていることが確認できます。