はじめに
Autonomous Databaseで、Oracle管理のオブジェクト・ストレージにデータを格納するCloud Tableの機能が利用可能になったので、検証してみました。
表データをオブジェクト・ストレージに格納するので、Autonomous Transaction Processing(ATP)では、DBストレージに表データを格納する場合より安価に表データを保持することができます。
Autonomous Data Warehouse(ECPUモデル)では、DBストレージの方がオブジェクト・ストレージより単価が安いため、Cloud Tableによるコスト・メリットはありません。
Cloud Tableはオブジェクト・ストレージにデータを格納するため、DBストレージにデータを格納する場合と比較するとパフォーマンス的には不利になりますので、ログデータ等のアクセス頻度の低いデータや低速アクセスが許容されるデータに向いていると思われます。
なお、Cloud Tableには、以下のような制限がありますので、ご注意ください。
(詳細はマニュアルをご参照ください)
・最大列数は996列に制限される
・インデック、不可視列、仮想列、DMLトリガー、ブーリアン型はサポートされない
・MERGE文はサポートされない
・LOB列の最大サイズは10MB
・INSERT実行時はロックを取得しない
・UPDATE/DELETE実行時は表に対して排他ロックが取得される
1. Cloud Tableの作成
Cloud Tableの作成にはDBMS_CLOUD.CREATE_CLOUD_TABLEプロシージャを使用します。
table_nameに作成する表の名前、column_listに列とその型をリストします。
SQL> BEGIN
2 DBMS_CLOUD.CREATE_CLOUD_TABLE(
3 table_name => 'EMP_CLOUD_TABLE',
4 column_list => 'empno NUMBER, ename VARCHAR2(10)'
5 );
6 END;
7* /
PL/SQL procedure successfully completed.
SQL>
2. Cloud Tableに対するDMLの実行
作成したCloud Table emp_cloud_tableにデータをINSERTしてみます。
SQL> INSERT INTO emp_cloud_table VALUES (7369,'SMITH');
1 row inserted.
SQL> INSERT INTO emp_cloud_table VALUES (7499,'ALLEN');
1 row inserted.
SQL> INSERT INTO emp_cloud_table VALUES (7511,'WARD');
1 row inserted.
SQL> COMMIT;
Commit complete.
SQL>
問題なくデータがINSERTできました。
emp_cloud_tableの内容を確認してみます。
SQL> SELECT * FROM emp_cloud_table;
EMPNO ENAME
________ ________
7369 SMITH
7499 ALLEN
7511 WARD
SQL>
emp_cloud_tableにデータがINSERTされていることが確認できました。
作成したCloud Table emp_cloud_tableのデータをUPDATEしてみます。
SQL> UPDATE emp_cloud_table SET ename = 'JACKSON'
2* WHERE empno = 7369;
1 row updated.
SQL> COMMIT;
Commit complete.
SQL>
問題なくデータがUPDATEできました。
emp_cloud_tableの内容を確認してみます。
SQL> SELECT * FROM emp_cloud_table;
EMPNO ENAME
________ __________
7369 JACKSON
7499 ALLEN
7511 WARD
SQL>
emp_cloud_tableのデータがUPDATEされていることが確認できました。
作成したCloud Table emp_cloud_tableのデータをDELETEしてみます。
SQL> DELETE FROM emp_cloud_table
2* WHERE empno = 7369;
1 row deleted.
SQL> COMMIT;
Commit complete.
SQL>
問題なくデータがDELETEできました。
emp_cloud_tableの内容を確認してみます。
SQL> SELECT * FROM emp_cloud_table;
EMPNO ENAME
________ ________
7499 ALLEN
7511 WARD
SQL>
emp_cloud_tableのデータがDELETEされていることが確認できました。
USER_SEGMENTSディクショナリ・ビューに対してクエリを実行してみます。
SQL> SELECT segment_name,sum(bytes) FROM user_segments
2 WHERE segment_name LIKE 'EMP%'
3 GROUP BY segment_name
4* /
SEGMENT_NAME SUM(BYTES)
_______________ _____________
EMP 65536
SQL>
USER_SEGMENTSディクショナリ・ビューに対してクエリを実行し、emp_cloud_tableがDB内にセグメントを持たないことが確認できました。
(emp表は事前に作成した通常の表です。emp_cloud_table表は検索結果に表示されていないので、DB内にセグメントを持たないことがわかります。)
参考情報
Use Cloud Tables to Store Logging and Diagnostic Information