Autonomous Database：Cloud Tableを使用してObject Storageに更新可能な表を作成してみた

# はじめに

Autonomous Databaseで、Oracle管理のオブジェクト・ストレージにデータを格納するCloud Tableの機能が利用可能になったので、検証してみました。

表データをオブジェクト・ストレージに格納するので、Autonomous Transaction Processing（ATP）では、DBストレージに表データを格納する場合より安価に表データを保持することができます。

Autonomous Data Warehouse（ECPUモデル）では、DBストレージの方がオブジェクト・ストレージより単価が安いため、Cloud Tableによるコスト・メリットはありません。

Cloud Tableはオブジェクト・ストレージにデータを格納するため、DBストレージにデータを格納する場合と比較するとパフォーマンス的には不利になりますので、ログデータ等のアクセス頻度の低いデータや低速アクセスが許容されるデータに向いていると思われます。

なお、Cloud Tableには、以下のような制限がありますので、ご注意ください。
（詳細は[マニュアル](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/cloud-tables-object-storage.html#GUID-4950230F-CC83-4198-9401-BEB2704D5C20)をご参照ください）

・最大列数は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](https://docs.oracle.com/en/cloud/paas/autonomous-database/serverless/adbsb/cloud-tables-object-storage.html)