Oracle Database 19cでAutomatic indexing（自動索引生成）に挑戦

#はじめに
※結論から言うと、Automatic indexingの動作は確認できていません。
　忙しい方は読まないでください。


2019年に公開された Oracle Database 19c の新機能の一つに、
**Automatic indexing（自動索引生成）**があります。
大まかに言うと、**ワークロードに応じてDBが索引を自動的に作成/削除する**というものです。

>Database Administrator’s Guide（19c）
>  [21 Managing Indexes](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-indexes.html#GUID-D1285CD5-95C0-4E74-8F26-A02018EA7999) より
>***
>Automatic indexing provides the following functionality:

>＜以下、Google翻訳＞

>自動索引付けには、以下の機能があります。

>　・事前定義された時間間隔で定期的に自動索引付けプロセスをバックグラウンドで実行します。
　・アプリケーションのワークロードを分析し、それに応じて新しいインデックスを作成し、
　　既存のパフォーマンスの低いインデックスを削除してデータベースのパフォーマンスを向上させます。
　・ALTER TABLE MOVEなど、表パーティションのメンテナンス操作のために
　　使用不可能とマークされている索引を再作成します。
　・データベースで自動索引付けを構成し、自動索引付け操作に関連するレポートを生成

DBAにとってはチューニング業務が少なくなる素晴らしい機能に違いない！(棒)ので、
どんなものか確認してみたいと思います。

#バージョン
Oracle Linux 7.6 上に 19c Enterprise Edition をインストールしました。

```sql
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
```

#Automatic Indexing に挑戦
Automatic Indexing の設定値は、DBA_AUTO_INDEX_CONFIG ビューより確認できます。


```sql
SQL> select * from DBA_AUTO_INDEX_CONFIG ;

PARAMETER_NAME				 PARAMETER_VALUE      LAST_MODIFIED	   MODIFIED_BY
---------------------------------------- -------------------- -------------------- --------------------
AUTO_INDEX_COMPRESSION			 OFF
AUTO_INDEX_DEFAULT_TABLESPACE
AUTO_INDEX_MODE 			 OFF
AUTO_INDEX_REPORT_RETENTION		 31
AUTO_INDEX_RETENTION_FOR_AUTO		 373
AUTO_INDEX_RETENTION_FOR_MANUAL
AUTO_INDEX_SCHEMA
AUTO_INDEX_SPACE_BUDGET 		 50
```

AUTO_INDEX_MODE が OFF なので、デフォルトはオフのようです。
設定方法が分からないので、マニュアルを確認します。

>Database Administrator’s Guide（19c）
>  [21 Managing Indexes](https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-indexes.html#GUID-D1285CD5-95C0-4E74-8F26-A02018EA7999) より
***
>You can use the AUTO_INDEX_MODE configuration setting to enable or disable automatic indexing in a database.
>
>The following statement enables automatic indexing in a database and creates any new auto indexes as visible indexes, so that they can be used in SQL statements:

>>EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');


>＜Google翻訳＞

>AUTO_INDEX_MODE構成設定を使用して、データベース内の自動索引付けを有効または無効にすることができます。
>
次の文は、データベースで自動索引付けを有効にし、新しい自動索引を可視索引として作成します。これにより、それらはSQL文で使用できます。

とりあえず、マニュアルに書いてあるSQLを実行すれば設定できそう？

```sql
SQL> EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
BEGIN DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT'); END;

*
行1でエラーが発生しました。:
ORA-40216: 機能がサポートされていません ORA-06512:
"SYS.DBMS_SYS_ERROR", 行79
ORA-06512: "SYS.DBMS_AUTO_INDEX_INTERNAL", 行9180
ORA-06512: "SYS.DBMS_AUTO_INDEX", 行283
ORA-06512: 行1
```

なぜかエラー…
スキーマ単位でも設定できるようなので、試してみます。

```sql
SQL> begin
  2      dbms_auto_index.configure (
  3           parameter_name => 'AUTO_INDEX_SCHEMA' ,
  4           parameter_value => 'SCOTT' ,
  5           allow => NULL) ;
  6  end;
  7  /
begin
*
行1でエラーが発生しました。:
ORA-40216: 機能がサポートされていません ORA-06512:
"SYS.DBMS_SYS_ERROR", 行79
ORA-06512: "SYS.DBMS_AUTO_INDEX_INTERNAL", 行9180
ORA-06512: "SYS.DBMS_AUTO_INDEX", 行283
ORA-06512: 行2
```

同じ結果…
エラーの意味を確認してみます。

>18c（19cは日本語訳がないので）の [エラー・メッセージ](https://docs.oracle.com/cd/E96517_01/errmg/index.html) より

>>ORA-40216: 機能がサポートされていません
>>　原因: この機能はAPIではサポートされていません。
>>　処置: この機能を使用しないようにコードを変更してください。

19c ではAutomatic Indexing は使えない？
そんなはずはないのですが…19c の目玉機能のはずなのに……

と思ったら、非Exadata環境では Automatic indexing は使えないようでした。


>　*Database Licensing Information User Manual（19c）*
>　*[1 Licensing Information](https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/index.html)*

>|Feature / Option / Pack |SE2|EE | EE-ES | DBCS SE|DBCS EE	|DBCS EE-HP|DBCS EE-EP|ExaCS|Notes|
|:---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|Automatic Indexing|N|N★|Y|N|N|N|N|Y|EE-ES: Available on Exadata. Not available on Oracle Database Appliance.|

20c では非ExadataでもAutomatic indexing が使えると良いなあ…


（2019/06/03追記）
19cで大きく動作が変わりそうな点として、他に
　・リアルタイム統計（DML操作の実行中に統計情報が自動的に収集される）
　・高頻度自動オプティマイザ統計収集（高頻度（最小1分）で統計情報を自動的に収集する）
等がありますが、これらも同様に非Exadataでは使えない機能でした……