Oracle Autonomous Databaseに慣れる（２）

Oracle Autonomous DatabaseにはAutonomous Transaction Processing (ATP)とAutonomous Data Warehouse (ADW)が提供されています。どちらもOracle Databaseソフトウェアが稼働しています。Always Free環境を使って、ATPとADWの初期設定の違いについて検証しました。

# バージョンとエディション
現時点ではATPとADWはどちらもOracle Database 18cを使っており、エディションにも違いは無いようです。V\$INSTANCEビューやV$DATABASEビューの属性にも違いはありませんでした。

```
SQL> SELECT * FROM V$VERSION;

BANNER                                                                           BANNER_FULL
-------------------------------------------------------------------------------- ---------------------------------------------------------------------------------
BANNER_LEGACY                                                                        CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production           Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
                                                                                 Version 18.4.0.0.0
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production                    0
```

有償版ではATP/ADW共にOracle Database 19cを選択できます。

![Version](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/f364eef6-47e2-a8c7-6ff1-fdc70b442b49.png)


# 初期化パラメーター
　初期化パラメーターは初期状態で以下の違いがありました。Always Free環境なのでCPU数は1です。

|初期化パラメーター名|ATP|ADW|
|:---|:---|:---|
|optimizer_ignore_hints|FALSE|TRUE|
|optimizer_ignore_parallel_hints|FALSE|TRUE|
|parallel_degree_policy|MANUAL|AUTO|
|parallel_min_degree|1|CPU|
|pdb_lockdown|OLTP|DWCS|
|pga_aggregate_limit|6,291,456,000|10,695,475,200|
|pga_aggregate_target|3,145,728,000|5,347,737,600|
|resource_manager_plan|FORCE:OLTP_PLAN|FORCE:DWCS_PLAN|
|result_cache_max_result|5|1|
|result_cache_mode|MANUAL|FORCE|
|sga_target|8,388,608,000|3,565,158,400|

上記以外に名前や接続インスタンスに関するパラメータには違いが見られます。

|初期化パラメーター名|{異なる部分}|
|:---|:---|
|audit_file_dest|/u02/app/oracle/admin/{db_name}/adump|
|control_files|+DATA/{db_name}/CONTROLFILE/current.{id}, +RECO/{db_name}/CONTROLFILE/current.{id}|
|core_dump_dest|/u02/app/oracle/diag/rdbms/{db_name}/{instance_name}/cdump|
|db_name|{db_name}|
|db_unique_name|{db_name}|
|dg_broker_config_file1|/u02/app/oracle/product/18.1.0.0/dbhome_1/dbs/dr1{db_name}.dat|
|dg_broker_config_file2|/u02/app/oracle/product/18.1.0.0/dbhome_1/dbs/dr2{db_name}.dat|
|dispatchers|(PROTOCOL=TCP) (SERVICE={db_name}XDB)|
|instance_name|{instance_name}|
|service_names|{instance_name}|
|thread|{接続インスタンス}|

## ヒント
ADW環境ではオプティマイザ・ヒントが無視される設定になっています（optimizer_ignore_hints, optimizer_ignore_parallel_hints）。データウェアハウス環境で多用される複雑なSQLの解析はオプティマイザに任せて余計なヒントは使ってくれるなということでしょう。これらの初期化パラメーターは変更することもできます。

## パラレル・クエリー
ADWでは自動パラレル度設定（parallel_degree_policy, parallel_min_degree）が有効化されています。大規模な全件検索処理が多いデータウェアハウス向けのセッティングと言えます。これらの初期化パラメーターは変更できません。

```
SQL> ALTER SYSTEM SET parallel_min_degree=1;
ORA-01031: insufficient privileges

SQL> ALTER SESSION SET parallel_min_degree=1;
ORA-01031: insufficient privileges
```

ただし「ALTER SESSION DISABLE PARALLEL DML」文は実行できるため、一時的にパラレル・クエリーの使用を停止することはできます。

## メモリー設定
　SGAとPGAの割り振りがATPとADWでは異なります（sga_target, pga_aggregate_*）。ADWではSGAを小さめに、PGAを大きめに確保しています。これはデータ量が多いためキャッシュにデータが乗りきらず、個別のソート処理が多いことを前提にした設計だと思われます。リザルトキャッシュ設定（result_cache_mode, result_cache_max_result）もADWでは有効化されています。
　一般的にデータウェアハウス系のデータベースではブロックサイズを大きめに取ることが多いのですが、ADWではdb_block_sizeはデフォルトの8KBのままです。

## リソース制限
ロックダウン・プロファイル名（pdb_lockdown）が異なることから、ATPとADWでは設定できる項目に違いがあると思われますが調べられていません。またリソースプラン（resource_manager_plan）についても違いが見られます。

# ストレージ
物理構成はわかりませんが、ASMのレベルのストレージ設定はATP/ADW共に変わらないようです。
データ用とリカバリ用で同サイズのストレージが構成されています。

```
SQL> SELECT NAME, ALLOCATION_UNIT_SIZE, BLOCK_SIZE, TYPE, TOTAL_MB FROM V$ASM_DISKGROUP;

NAME                           ALLOCATION_UNIT_SIZE BLOCK_SIZE TYPE     TOTAL_MB
------------------------------ -------------------- ---------- ------ ----------
DATA                                        4194304       4096 HIGH    269035456
RECO                                        4194304       4096 NORMAL   67239936
```

# データ型
ADWのデフォルトではハイブリッド列圧縮（HCC）が有効になっています。このため圧縮しない指定をしない限りLONG型やLONG RAW型の列は作成できません。

```
CREATE TABLE data1(c1 NUMBER, c2 LONG)
エラー・レポート -
ORA-64308: Hybrid Columnar圧縮表には、LONGデータ型の列を使用できません
64308. 00000 -  "hybrid columnar compressed table cannot have column with LONG data type"
*Document: YES
*Cause:    One of the following was attempted
           - Create a hybrid columnar compressed table with a LONG data type.
           - Alter an existing table with a LONG data type to be hybrid columnar compressed.
           - Add a LONG data type column to a hybrid columnar compressed table.
*Action:   LONG data types are not supported with hybrid columnar compressed
           tables. Create table without LONG column or change table to not be
           hybrid columnar compressed. If adding a column, do not use
           LONG data type. If modifying attributes of a column to change data
           type to LONG, the table cannot be hybrid columnar compressed.
```

# まとめ
内部的な動作については異なる可能性もありますが、思ったよりもATPとADWの初期状態は変わらないという印象です。逆に目に見える部分の設定をそれほど変えずにOLTPとデータウェアハウス両方のワークロードを捌けるとすれば、それはOracle Databaseの優れた部分だと思います。