85 DBMS_INMEMORY_ADMIN
DBMS_INMEMORY_ADMINは、インメモリー・ファスト・スタート(IMファスト・スタート)領域およびインメモリー式(IM式)を管理するためのインタフェースを提供します。
この章のトピックは、次のとおりです:
参照:
Oracle Database In-Memory機能についてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。
85.1 DBMS_INMEMORY_ADMINの概要
このパッケージは、インメモリー式(IM式)およびインメモリー・ファスト・スタート(IMファスト・スタート)領域を管理するためのインタフェースを提供します。
IM式
分析的な問合せには、多くの場合、実行中にCPUおよびメモリーを大量に消費する複雑な式や計算が含まれています。DBMS_INMEMORY_ADMINプロシージャを使用して、これらのうち頻繁に使用される(ホットな)式を特定し、IM列ストアに移入できます。こうすることで、データベースで同じ計算が繰り返し実行されることがなくなり、パフォーマンスが向上します。
データベースでは、IM式がシステム生成の仮想列として示されます。IM仮想列の名前はSYS_IMEで始まります。DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONSおよびDBMS_INMEMORY.IME_DROP_EXPRESSIONSを使用して、既存のSYS_IME列を削除することもできます。
DBA_IM_EXPRESSIONSビューには、INMEMORY属性を持つSYS_IME列が表示されます。IME_CAPTURE_EXPRESSIONSプロシージャの使用後は、このビューを問い合せて、データベースの異なる表に追加されたホットな式を確認できます。
参照:
IM式についてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。
IMファスト・スタート領域
IMファスト・スタート領域に格納されるデータにより、データベースの再起動時にIM列ストアの移入が最適化されます。データベースでは、列データを圧縮またはフォーマットすることなく持続記憶域から直接読み取るため、データベース・インスタンスの再起動時には移入がより高速で行われます。
IM列ストアに対してIMファスト・スタートを有効にする場合、IMファスト・スタート領域のASSM表領域を指定する必要があります。表領域には、SYSDBIMFS_LOGSEG$という名前のSecureFiles LOBのデータが格納されます。SYSAUX表領域にはメタデータが格納されます。データがIM列ストアに移入または再移入されると、データベースにより自動的にデータがIMファスト・スタート領域に書き込まれます。手動で書込みを実行することはできません。オブジェクトをNO INMEMORYとして指定すると、データベースによりそのオブジェクトがIMファスト・スタート領域から削除されます。
IMファスト・スタート領域が不足すると、データベースにより自動的に最も古い15%のセグメントが削除され、列データの保存が継続されます。使用可能な領域がなくなると、IMファスト・スタート領域への書込みが停止します。
参照:
IM式についてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。
85.3 DBMS_INMEMORY_ADMINの操作上のノート
DBMS_INMEMORY_ADMINファスト・スタート操作は、失敗するまたは中断される場合があります。
失敗または中断シナリオでは、次のルールによって使用できるサブプログラムが決定されます。
-
FASTSTART_ENABLEが成功しなかった場合、許可される操作はFASTSTART_ENABLEの再実行のみです。 -
FASTSTART_MIGRATE_STORAGEが成功しなかった場合、許可される操作はFASTSTART_MIGRATE_STORAGEの再実行のみです。 -
FASTSTART_DISABLEが成功しなかった場合は、すべてのDBMS_INMEMORY_ADMIN操作が許可されます。
85.4 DBMS_INMEMORY_ADMINサブプログラムの要約
この表は、DBMS_INMEMORY_ADMINサブプログラムを示し、簡単に説明しています。
表85-1 DBMS_INMEMORY_ADMINパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
このプロシージャは、インメモリー・ファスト・スタート(IMファスト・スタート)機能を無効にします。 |
|
|
このプロシージャは、IMファスト・スタートを有効にし、表領域を割り当てます。 |
|
|
このプロシージャは、すべてのIMファスト・スタート・データおよびメタデータを既存の表領域から指定された新しい表領域に移動します。 |
|
|
このファンクションは、現在IMファスト・スタートに指定されている表領域の名前を戻します。 |
|
|
このプロシージャは、式取得ウィンドウでデータベース内の最も頻繁にアクセスされている(最もホットな)式を20個取得して移入します。 |
|
|
このプロシージャは、データベース内の |
|
|
このプロシージャは、最後に起動された |
85.4.1 FASTSTART_DISABLEプロシージャ
このプロシージャは、インメモリー・ファスト・スタート(IMファスト・スタート)機能を無効にします。
構文
DBMS_INMEMORY_ADMIN.FASTSTART_DISABLE();
セキュリティ・モデル
このプロシージャを実行するには、管理者権限が必要です。
使用上のノート
プロシージャを実行すると、データベースにより次のアクションが実行されます。
-
すべてのIMファスト・スタート操作が完了するまで待機します。
-
IMファスト・スタート機能を無効にし、次の操作を実行します。
-
IMファスト・スタート領域を消去します。
-
SYSAUX表領域に格納されているIMファスト・スタート・メタデータを削除します。 -
IMファスト・スタート表領域を解放します(ただし、削除はしません)。
-
このプロシージャは、IM列ストアの同時操作を中断したり、操作に影響することはありません。
例
次のPL/SQLプログラムは、IMファスト・スタート機能を無効にします。
EXEC DBMS_INMEMORY_ADMIN.FASTSTART_DISABLE;次の問合せは、IMファスト・スタート表領域のLOBが削除されたことを示しています(サンプル出力も示されています)。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a20
SELECT l.OWNER, l.SEGMENT_NAME, SUM(s.BYTES)/1024/1024 MB
FROM DBA_LOBS l, DBA_SEGMENTS s
WHERE l.SEGMENT_NAME = s.SEGMENT_NAME
AND l.TABLESPACE_NAME = 'FS_TBS'
GROUP BY l.OWNER, l.SEGMENT_NAME;
no rows selected85.4.2 FASTSTART_ENABLEプロシージャ
このプロシージャは、インメモリー・ファスト・スタート(IMファスト・スタート)を有効にし、IMファスト・スタート(ファスト・スタート)領域の表領域を指定します。
構文
DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE(
tbs_name IN VARCHAR2,
nologging IN BOOLEAN DEFAULT TRUE);
パラメータ
表85-2 FASTSTART_ENABLEプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ファスト・スタート領域のASSM表領域の名前。 |
|
|
ファスト・スタート領域に対して作成されたLOBのロギング・モード。
|
セキュリティ・モデル
このプロシージャを実行するには、管理者権限が必要です。
使用上のノート
IMファスト・スタートを有効にするには、FASTSTART_ENABLEで指定されたASSM表領域が存在し、SYSAUX表領域がオンラインになっている必要があります。個々のPDBまたは非CDBについて存在するファスト・スタート表領域は1つだけです。指定された表領域にはIM列ストアのデータを格納するための十分な領域があり、ファスト・スタート領域として指定される前に他のデータはまったく含まれていないことが必要です。表領域のサイズは、INMEMORY_SIZE初期化パラメータのサイズの2倍以上に設定することをお薦めします。
データベースでは、IM列ストアが移入されるまで、ディスク上にファスト・スタート領域が作成されません。移入後、列データがファスト・スタート領域に定期的に保存されます(トランザクション・ジャーナルなどのメタデータは保存されません)。これは、ディスク上でSYSDBIMFS_LOBSEG$セグメントとして表されます。データベースでは、SYSAUX表領域にファスト・スタート・メタデータを格納します。Oracle Real Application Clusters (Oracle RAC)環境では、すべてのノード間でIMファスト・スタート・データが共有されます。
ノート:
IMファスト・スタートは、スタンバイ・データベース・インスタンスではサポートされていません。
メモリー内へのIMCUの初期ローディングが高コストでCPUバウンドである一方、IM FastStart表領域では断続的なI/Oが求められます。データベースは、列データを定期的にIMファスト・スタート領域に書き込みます。データベース・インスタンスを再起動する必要がある場合、Oracle DatabaseではIMCUを最初から再構築するのではなく、IMファスト・スタート領域から直接列データを読み取ります。列データの圧縮およびフォーマットは不要です。
例
この例では、fs_tbsをASSM表領域として作成してから、FASTSTART_ENABLEを使用してこの表領域をIMファスト・スタート領域として指定します。
CREATE TABLESPACE fs_tbs
DATAFILE 'fs_tbs.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
EXEC DBMS_INMEMORY_ADMIN.FASTSTART_ENABLE('fs_tbs');
次の問合せは、IMファスト・スタートLOBが作成されたことを示しています(サンプル出力も示されています)。
COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a20
SELECT l.OWNER, l.SEGMENT_NAME, SUM(s.BYTES)/1024/1024 MB
FROM DBA_LOBS l, DBA_SEGMENTS s
WHERE l.SEGMENT_NAME = s.SEGMENT_NAME
AND l.TABLESPACE_NAME = 'FS_TBS'
GROUP BY l.OWNER, l.SEGMENT_NAME;
OWNER SEGMENT_NAME MB
----- -------------------- ----------
SYS SYSDBIMFS_LOBSEG$ .125
85.4.3 FASTSTART_MIGRATE_STORAGEプロシージャ
このプロシージャは、インメモリー・ファスト・スタート(IMファスト・スタート)データを現在の表領域から新しい表領域に移動してカタログ化します。
構文
DBMS_INMEMORY_ADMIN.FASTSTART_MIGRATE_STORAGE(
tbs_name IN VARCHAR2 );
パラメータ
表85-3 FASTSTART_MIGRATE_STORAGEプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
IMファスト・スタート領域の新しいASSM表領域の名前。 |
セキュリティ・モデル
このプロシージャを実行するには、DBA権限が必要です。
使用上のノート
プロシージャを実行すると、データベースにより次のアクションが実行されます。
-
すべてのIMファスト・スタート操作が完了するまで待機します。
-
IMファスト・スタート機能を無効にします。
-
IMファスト・スタートのデータおよびメタデータを新しい表領域にコピーし、古い表領域はそのままにします。
-
IMファスト・スタート機能を再度有効にします。
例
次のプログラムは、IMファスト・スタート表領域が存在する場合はその名前を取得し、結果を出力します(サンプル出力も示されています)。
VARIABLE b_fstbs VARCHAR2(20)
BEGIN
:b_fstbs := DBMS_INMEMORY_ADMIN.GET_FASTSTART_TABLESPACE;
END;
/
PRINT b_fstbs
B_FSTBS
-----------------------------
FS_TBS
次の文は、fs_tbs2という名前の新しい表領域を作成し、その表領域にIMファスト・スタート領域を移行します。
CREATE TABLESPACE fs_tbs2
DATAFILE 'fs_tbs2.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
EXEC DBMS_INMEMORY_ADMIN.FASTSTART_MIGRATE_STORAGE('fs_tbs2');
次のプログラムは、現在のIMファスト・スタート表領域の名前を出力します(サンプル出力も示されています)。
BEGIN
:b_fstbs := DBMS_INMEMORY_ADMIN.GET_FASTSTART_TABLESPACE;
END;
/
PRINT b_fstbs
B_FSTBS
-----------------------------
FS_TBS2
85.4.4 GET_FASTSTART_TABLESPACEファンクション
このファンクションは、インメモリー・ファスト・スタート(IMファスト・スタート)に割り当てられた表領域を戻します。機能が無効な場合、ファンクションはNOT ENABLEDを戻します。
構文
DBMS_INMEMORY_ADMIN.GET_FASTSTART_TABLESPACE();セキュリティ・モデル
このファンクションを実行するには、DBA権限が必要です。
例
このプログラムは、IMファスト・スタート表領域が存在する場合はその名前を取得し、結果を出力します。
VARIABLE b_fstbs VARCHAR2(20)
BEGIN
:b_fstbs := DBMS_INMEMORY_ADMIN.GET_FASTSTART_TABLESPACE;
END;
/
PRINT b_fstbs
B_FSTBS
-----------------------------
NOT ENABLED
85.4.5 IME_CAPTURE_EXPRESSIONSプロシージャ
このプロシージャは、指定された時間範囲でデータベース内の最も頻繁にアクセスされている(最もホットな)式を20個取得および移入します。
構文
DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS(
snapshot IN VARCHAR2);
パラメータ
表85-4 IME_CAPTURE_EXPRESSIONSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
式統計が考慮される期間を定義するスナップショットを指定します。次のいずれかの値を指定できます。
|
使用上のノート
このプロシージャを起動すると、データベースでは式統計ストア(ESS)を問い合せて、少なくとも一部がIM列ストアに移入されている表の式のみを考慮します。データベースにより、最もホットな20個の式がそれぞれの表に、文字列SYS_IMEという接頭辞が付いた非表示の仮想列として追加され、デフォルトのINMEMORY列圧縮句が適用されます。前の呼出し時に追加されたSYS_IME列が、最新の上位20件のリスト内になくなると、データベースにより、それらがNO INMEMORYとしてマークされます。
ノート:
スタンバイ・データベースでIME_CAPTURE_EXPRESSIONSを実行することはできません。
属性がINMEMORYかNO INMEMORYかに関係なく、表のSYS_IME列の最大数は50個です。表の上限に達すると、データベースにより、新しいSYS_IME列は追加されなくなります。新しい式のために領域を空けるには、IME_DROP_EXPRESSIONSまたはIME_DROP_ALL_EXPRESSIONSプロシージャを使用して、SYS_IME列を手動で削除する必要があります。
各表に対する50個の式の制限(INMEMORYおよびNO INMEMORY式の両方を含む)は、データベースに対する20個の式の制限(INMEMORY式のみを含む)とは異なります。たとえば、IM列ストアに20個の表が移入された場合、各表に、INMEMORY属性を持つ1つのSYS_IME列と、NO INMEMORY属性を持つ49個のSYS_IME列が含まれている可能性があります。
IM式および仮想列は、インメモリー式単位(IMEU)と呼ばれるインメモリー構造に格納されます。すべてのIMEUは、その導出元である親インメモリー圧縮ユニット(IMCU)を持ちます。IMEUは、そのIMCUの圧縮特性を継承します。
ノート:
IM式では、NLS依存のデータ型はサポートされていません。
例85-1: 圧縮の継承の例
次の文では、test_tblという名前のNO INMEMORY表が作成されます。
CREATE TABLE test_tbl (a NUMBER, b NUMBER, vc1 AS (2*a), vc2 AS (3*a));
次のDDL文は、この表をINMEMORYとしてマークします。
ALTER TABLE test_tbl
INMEMORY
INMEMORY (vc1)
INMEMORY MEMCOMPRESS FOR DML (vc2);前述の文は、次のように圧縮を適用します。
-
INMEMORYは、表全体にデフォルトの圧縮を適用します。デフォルトの圧縮はFOR QUERY LOWです。 -
INMEMORY (vc1)は、表の圧縮レベルを列vc1に適用します。表の圧縮はFOR QUERY LOWであるため、列vc1は圧縮FOR QUERY LOWを継承します。 -
INMEMORY MEMCOMPRESS FOR DML (vc2)は、DML圧縮を列vc2に適用します。
85.4.6 IME_DROP_ALL_EXPRESSIONSプロシージャ
このプロシージャは、データベース内のSYS_IME式仮想列をすべて削除します。
構文
DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS();
使用上のノート
IME_DROP_ALL_EXPRESSIONSプロシージャは、INMEMORY属性の有無に関係なく、すべての表からすべてのSYS_IME列を削除します。事実上、このプロシージャは、データベース規模のリセット・ボタンの役割を果たします。
IME_DROP_ALL_EXPRESSIONSを使用すると、SYS_IME列があるセグメントのすべてのIMEUおよびIMCUの削除がトリガーされます。たとえば、移入された50個の表にそれぞれ1つのSYS_IME列がある場合は、IME_DROP_ALL_EXPRESSIONSによって、IM列ストアから50個すべての表が削除されます。これらのセグメントを再度移入するには、DBMS_INMEMORY.POPULATEプロシージャを使用するか、表の全体スキャンを実行する必要があります。
85.4.7 IME_POPULATE_EXPRESSIONSプロシージャ
このプロシージャは、最後に起動されたDBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONSで取得された式を強制的に移入します。
構文
DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
使用上のノート
このプロシージャを起動しない場合、データベースでは、SYS_IME列の親IMCUが再移入されたときに、これらの列を段階的に再移入します。表が再移入されない場合、IME_CAPTURE_EXPRESSIONSプロシージャによって取得された新しいSYS_IME列は移入されません。IME_POPULATE_EXPRESSIONSは、移入を強制的に実行することで、この問題を解決します。
プロシージャは、内部的に、INMEMORY属性を持つSYS_IME列を含むすべての表に対して、DBMS_INMEMORY.REPOPULATEを起動します。指定された表サブセット内のSYS_IME列を移入するには、IME_POPULATE_EXPRESSIONSではなくDBMS_INMEMORY.REPOPULATEを使用します。