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 selected
85.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
を使用します。