[Oracle Database]自動索引、自動パーティショニング、自動マテリアライズド・ビュー 


# はじめに
Autonomous Database（ADB）では、Oracle Databaseの新機能を先行して取り入れています。
現在（2022年3月時点）ADBで使用できるOracle Databaseのバージョンは```19c```ですが、先行して```21c```の新機能を取り入れています。
次の新機能について簡単にまとめました。

* 自動索引（Automatic Indexing）
* 自動パーティショニング（Automatic Partitioning）
* 自動マテリアライズド・ビュー


# 自動索引（Automatic Indexing）
## 自動索引とは
* Oracle Database 19cからの新機能（デフォルト：***無効***）
* アプリケーション・ワークロードを監視し、自動的に索引の作成や削除などの管理を行う
* 従来手作業で行っていた次のプロセスを機械的に反復実施
    * 索引の作成　→　検証　→　評価　→　有効化　→　削除
* 自動索引作成プロセスは```15分```ごとに実行
* 19cまで
    * 自動索引の対象：スキーマレベル
* 21cから
    * 自動索引の対象：表レベルで指定可能
    * スキーマレベルと表レベルで設定に差がある場合は```表レベル```の設定が優先される
        * 例：スキーマ単位では自動索引を無効にするが、特定の表のみで自動索引を有効にするケース
## 設定方法
[DBMS_AUTO_INDEX](https://docs.oracle.com/cd/F39414_01/arpls/DBMS_AUTO_INDEX.html#GUID-78C59A20-2F92-448F-96F7-6C4FBB355E42)パッケージの```CONFIGURE```プロシージャを使用して設定します。

* 設定の確認
    * [DBA_AUTO_INDEX_CONFIG](https://docs.oracle.com/cd/F39414_01/refrn/DBA_AUTO_INDEX_CONFIG.html#GUID-B0DAE369-B631-41ED-844B-9D7FBE21BF08)ビューで自動索引の設定を確認できます
        * [DBA_INDEXES](https://docs.oracle.com/cd/F39414_01/refrn/ALL_INDEXES.html#GUID-E39825BA-70AC-45D8-AF30-C7FF561373B6)ビューの```AUTO列```から索引が自動索引であるか確認できます

```sql
SELECT * FROM DBA_AUTO_INDEX_CONFIG;
```
AUTO_INDEX_MODEが**OFF**
```sql
                    PARAMETER_NAME    PARAMETER_VALUE                      LAST_MODIFIED         MODIFIED_BY 
__________________________________ __________________ __________________________________ ___________________ 
AUTO_INDEX_SCHEMA                                                                                            
AUTO_INDEX_DEFAULT_TABLESPACE                                                                                
AUTO_INDEX_SPACE_BUDGET            100                09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    
AUTO_INDEX_REPORT_RETENTION        373                09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    
AUTO_INDEX_RETENTION_FOR_AUTO      373                                                                       
AUTO_INDEX_RETENTION_FOR_MANUAL                                                                              
AUTO_INDEX_MODE                    OFF                                                                       
AUTO_INDEX_COMPRESSION             ON                 09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    

8 rows selected. 
```

* DBでの自動索引の有効化 
```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
```
```sql
SELECT * FROM DBA_AUTO_INDEX_CONFIG;
```
AUTO_INDEX_MODEが**IMPLEMENT**に変更された
```sql
                    PARAMETER_NAME    PARAMETER_VALUE                      LAST_MODIFIED         MODIFIED_BY 
__________________________________ __________________ __________________________________ ___________________ 
AUTO_INDEX_SCHEMA                                                                                            
AUTO_INDEX_DEFAULT_TABLESPACE                                                                                
AUTO_INDEX_SPACE_BUDGET            100                09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    
AUTO_INDEX_REPORT_RETENTION        373                09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    
AUTO_INDEX_RETENTION_FOR_AUTO      373                                                                       
AUTO_INDEX_RETENTION_FOR_MANUAL                                                                              
AUTO_INDEX_MODE                    IMPLEMENT          16-MAR-22 01.46.18.000000000 AM    ADMIN               
AUTO_INDEX_COMPRESSION             ON                 09-MAR-22 04.44.44.000000000 AM    C##CLOUD$SERVICE    

8 rows selected. 
```

|AUTO_INDEX_MODEパラメーター|内容|
|:--|:--|
|IMPLEMENT|自動索引を有効化|
|REPORT ONLY|新規自動索引が不可視の索引として作成され、SQL文では使用できなくなる。
|OFF|自動索引の無効化

※補足：ADBでは、自動索引を有効化すると、自動索引の索引圧縮（Advanced Compressionの機能）がデフォルト有効になります。

* DBでの自動索引の無効化
```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');
```
※補足：自動索引を無効化すると、新規自動索引が作成されませんが、既存の自動索引は有効のままです。



* スキーマ単位での有効/無効化の例
```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'SR', TRUE);
```

```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_SCHEMA', 'SR', FALSE);
```

* 表単位での有効/無効化の例
```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_TABLE', 'SH.SALES', TRUE);
```
```sql
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_TABLE', 'SH.SALES', FALSE);
```

## 参考情報
* マニュアル
    * ADBのマニュアル：[Autonomous Databaseでの自動索引作成の管理](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/autonomous-auto-index.html#GUID-D51A4F85-3AE5-4B7D-9B27-32CEDE8DBD79)
    * 21cマニュアル：[20.7 自動索引の管理](https://docs.oracle.com/cd/F39414_01/admin/managing-indexes.html#GUID-D1285CD5-95C0-4E74-8F26-A02018EA7999)
* Speak Deck：[[TechNight #50] Oracle Database 21c 新機能解説 第2回 (前半パート)](https://speakerdeck.com/oracle4engineer/technight-number-50-oracle-database-21c-xin-ji-neng-jie-shuo-di-2hui-qian-ban-pato?slide=4)
* [Oracle Database Technology Night](https://www.oracle.com/jp/database/events-docs/001/)：Autonomatic Indexingはいかに運用/チューニングをかえるのか

# 自動パーティショニング（Automatic Partitioning）
## 自動パーティショニングとは
* Oracle Database 19c からの新機能（デフォルト：***無効***）
* アプリケーション・ワークロードを監視し、自動的に表や索引にパーティションを作成
* 自動パーティショニングプロセスは```15分```ごとに実行

## 設定方法
[DBMS_AUTO_PARTITIONパッケージ](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/ref-dbms_auto_partition-package.html#GUID-D78DCF2C-090C-40F0-8CC1-0A4BEA196D68)の```CONFIGURE```プロシージャを使用して設定します。

* 設定の確認
    * [DBA_AUTO_PARTITION_CONFIG](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/mdw-managing-automatic-partitioning-autonomous-database.html#GUID-F07805B8-22BB-4675-AA66-60EDC083D908)ビューで確認できます。

```sql
SELECT * FROM DBA_AUTO_PARTITION_CONFIG;
```
```sql
                    PARAMETER_NAME    PARAMETER_VALUE                      LAST_MODIFIED    MODIFIED_BY 
__________________________________ __________________ __________________________________ ______________ 
AUTO_PARTITION_SCHEMA                                                                                   
AUTO_PARTITION_REPORT_RETENTION    90                                                                   
AUTO_PARTITION_MODE                OFF      
AUTO_PARTITION_TABLE               0                                                                    
```

* 有効化
```sql
EXEC DBMS_AUTO_PARTITION.CONFIGURE('AUTO_PARTITION_MODE','IMPLEMENT');
```
```sql
SELECT * FROM DBA_AUTO_PARTITION_CONFIG;
```
AUTO_PARTITION_MODEが**IMPLEMENT**に変更された
```sql
                    PARAMETER_NAME    PARAMETER_VALUE                      LAST_MODIFIED    MODIFIED_BY 
__________________________________ __________________ __________________________________ ______________ 
AUTO_PARTITION_SCHEMA                                                                                   
AUTO_PARTITION_REPORT_RETENTION    90                                                                   
AUTO_PARTITION_MODE                IMPLEMENT          16-MAR-22 01.49.34.000000000 AM    ADMIN          
AUTO_PARTITION_TABLE               0                
```

|AUTO_PARTITION_MODEパラメーター|内容|
|:--|:--|
|IMPLEMENT|自動パーティショニングを有効化|
|REPORT ONLY|自動パーティショニングによってレポートが生成されるが、既存表を変更しない（デフォルト値）|
|OFF|自動パーティショニングの無効化|

* 無効化
```sql
EXEC DBMS_AUTO_PARTITION.CONFIGURE('AUTO_PARTITION_MODE','OFF');
```

* スキーマ単位での有効/無効化例
```sql
BEGIN
    DBMS_AUTO_PARTITION.CONFIGURE(
         PARAMETER_NAME  => 'AUTO_PARTITION_SCHEMA', 
         PARAMETER_VALUE => 'HR',
         ALLOW           => TRUE);
END;
/
```

```sql
BEGIN
    DBMS_AUTO_PARTITION.CONFIGURE(
         PARAMETER_NAME  => 'AUTO_PARTITION_SCHEMA', 
         PARAMETER_VALUE => 'HR',
         ALLOW           => FALSE);
END;
/
```

## 参考情報
* マニュアル
    * ADBのマニュアル：[Autonomous Databaseでの自動パーティション化の管理](https://docs.oracle.com/cd/E83857_01/paas/autonomous-database/adbsa/mdw-managing-automatic-partitioning-autonomous-database.html#GUID-03973BB7-BD09-4E5E-B47F-430D7CC949D6)

* Qiita
    * [Autonomous DatabaseのAutomatic Partitioning（自動パーティショニング）の確認](https://qiita.com/billtench/items/45a922cf3291b2f96502)

# 自動マテリアライズド・ビュー
## 自動マテリアライズド・ビューとは
* Oracle Database 21cの新機能
* アプリケーション・ワークロードを監視し、マテリアライズド・ビュー（Mview）およびMViewログの作成やメンテナンスを自動化

## 設定方法
[DBMS_AUTO_MV](https://docs.oracle.com/cd/F39414_01/arpls/DBMS_AUTO_MV.html#GUID-05890817-CD74-4396-B468-9A82BE030321)パッケージのCONFIGUREプロシージャを使用して設定します。

* 確認方法
    * [DBA_AUTO_MV_CONFIG](https://docs.oracle.com/cd/F39414_01/refrn/DBA_AUTO_MV_CONFIG.html#GUID-35ED228B-5D64-43E8-89AB-D4E2215D8205)ビューで確認できます。

```sql
SELECT * FROM DBA_AUTO_MV_CONFIG;
```

* 有効化
```sql
EXEC DBMS_AUTO_MV.CONFIGURE('AUTO_MV_MODE','IMPLEMENT');
```

|AUTO_MV_MODEパラメーター|内容|
|:--|:--|
|IMPLEMENT|自動パーティショニングを有効化|
|REPORT ONLY|推奨次項が生成され、DBA_AUTO_MV_ANALYSIS_RECOMMENDATIONSを介してDBAが使用できるように内部リポジトリに格納|
|OFF|自動パーティショニングを無効化|


* 無効化
```sql
EXEC DBMS_AUTO_MV.CONFIGURE('AUTO_MV_MODE','OFF');
```