84 DBMS_INMEMORY
DBMS_INMEMORY
パッケージは、インメモリー列ストア(IM列ストア)機能のためのインタフェースを提供します。
この章のトピックは、次のとおりです:
84.1 DBMS_INMEMORYの概要
このパッケージには、IM列ストアを移入および再移入するためのプロシージャおよび指定された表からIM式を削除するためのプロシージャが含まれています。
IM移入および再移入
インメモリー移入(移入)は、データベースでディスクから既存の行形式データを読み取り、それを列形式に変換し、IM列ストアに格納するときに起こります。INMEMORY
属性を使用するオブジェクトのみが移入の候補となります。
移入は、ディスク上の既存のデータを列形式に変換するものであり、新しいデータをIM列ストアにロードする、再移入とは異なります。再移入は、列データに対して重大なDMLアクティビティが実行された後に自動的に行われます。
オブジェクトにINMEMORY
属性およびNONE
以外の優先度が設定されている場合、データベースでは、内部優先度キューに従ってオブジェクトが段階的にIM列ストアに移入されます。優先度がNONE
であるオブジェクトは、全体スキャンの実行時にのみ移入されます。DBMS_INMEMORY.POPULATE
プロシージャは、オブジェクトを強制的に即時に移入します。同様に、DBMS_INMEMORY.REPOPULATE
プロシージャはオブジェクトを強制的に即時に再移入します。
参照:
IM移入についてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。
IM式
IM式は、後で再利用するために、頻繁に評価される問合せ式をIM列ストアに移入します。IM式は非表示の仮想列として実体化され、文字列SYS_IME
が接頭辞として付加され、非仮想列と同様にアクセスされます。
DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
を使用すると、データベースにより、最もホットな20個の式が対応する表にSYS_IME
列として追加され、デフォルトのINMEMORY
列圧縮句が適用されます。前の呼出し時に追加されたSYS_IME
列が最新の式リスト内になくなると、データベースにより、それらの属性がNO INMEMORY
に変更されます。
属性がINMEMORY
かNO INMEMORY
かに関係なく、表のSYS_IME
列の最大数は50個です。1つの表に対して式が上限の50個に達すると、データベースで、新しいSYS_IME
列が追加されなくなります。新しい式のために領域を作り出すには、DBMS_INMEMORY.IME_DROP_EXPRESSIONS
またはDBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
プロシージャを使用して、SYS_IME
列を手動で削除する必要があります。
参照:
IM式についてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。
84.2 DBMS_INMEMORYのセキュリティ・モデル
DBMS_INMEMORYパッケージのサブプログラムは、実行者の権限で実行されます。
POPULATE
およびREPOPULATE
プロシージャを起動するユーザーには、指定されたオブジェクトに対するSELECT
権限が必要です。IME_DROP_EXPRESSIONS
の場合は、起動するユーザーに指定された表に対するALTER TABLE
権限が必要です。
84.3 DBMS_INMEMORYサブプログラムの要約
この表では、DBMS_INMEMORY
パッケージのサブプログラムをリストし、簡単に説明します。
表84-1 DBMS_INMEMORYパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
指定された一連の |
|
指定された表を強制的に移入します。 |
|
指定された表を強制的に再移入します。 |
|
IM列ストア内の最新でないIMCUを割当て解除します。 |
84.3.1 IME_DROP_EXPRESSIONSプロシージャ
このプロシージャは、指定された一連のSYS_IME
仮想列を表から削除します。
構文
DBMS_INMEMORY.IME_DROP_EXPRESSIONS(
schema_name IN VARCHAR2,
table_name IN VARCHAR2,
column_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表84-2 IME_DROP_EXPRESSIONSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
インメモリー表を含むスキーマの名前 |
|
|
|
|
使用上のノート
SYS_IME
列を削除する一般的な理由は、領域およびパフォーマンスです。属性がINMEMORY
かNO INMEMORY
かに関係なく、表のSYS_IME
列の最大数は50個です。1つの表に対して式が上限の50個に達すると、データベースにより、新しいSYS_IME
列は追加されなくなります。新しい式のために領域を作り出すには、DBMS_INMEMORY.IME_DROP_EXPRESSIONS
またはDBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
プロシージャを使用して、SYS_IME
列を手動で削除する必要があります。
要求された表で指定されたSYS_IME
列またはすべてのSYS_IME
列を削除するには、DBMS_INMEMORY.IME_DROP_EXPRESSIONS
を使用します。これらのセグメントを再度移入するには、DBMS_INMEMORY.POPULATE
プロシージャを起動するか、全表スキャンを実行します。
84.3.2 POPULATEプロシージャ
このプロシージャは、指定された表、パーティションまたはサブパーティションをIM列ストアに強制的に移入します。
構文
DBMS_INMEMORY.POPULATE(
schema_name IN VARCHAR2,
table_name IN VARCHAR2,
subobject_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表84-3 POPULATEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
スキーマの名前。 |
|
表の名前。 |
|
パーティションまたはサブパーティション |
84.3.3 REPOPULATEプロシージャ
このプロシージャは、現在IM列ストアに移入されている表、パーティションまたはサブパーティションを強制的に再移入します。
構文
DBMS_INMEMORY.REPOPULATE(
schema_name IN VARCHAR2,
table_name IN VARCHAR2,
subobject_name IN VARCHAR2 DEFAULT NULL,
force IN BOOLEAN DEFAULT FALSE);
パラメータ
表84-4 REPOPULATEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
オブジェクトを所有するスキーマの名前。 |
|
再移入を必要とする表の名前。 |
|
パーティションまたはサブパーティションの名前。NULLの場合、表全体が再移入されます。 |
|
最初の移入と同様に、セグメントのすべてのIMCUを再移入するかどうか。 次の値を
たとえば、IMCU 1には行1から500,000までが含まれ、IMCU 2には行500,001から1,000,000までが含まれています。文により、行600,000が変更されます。 さらに |
84.3.4 SEGMENT_DEALLOCATE_VERSIONSプロシージャ
このプロシージャは、IM列ストア内の最新でないIMCUを割当て解除します。
構文
DBMS_INMEMORY.SEGMENT_DEALLOCATE_VERSIONS(
SCHEMA_NAME IN VARCHAR2,
TABLE_NAME IN VARCHAR2,
PARTITION_NAME IN VARCHAR2 DEFAULT NULL,
SPCPRESSURE IN BOOLEAN DEFAULT FALSE);
パラメータ
表84-5 SEGMENT_DEALLOCATE_VERSIONSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
オブジェクトを所有するスキーマの名前。 |
|
再移入を必要とする表の名前。 |
|
パーティションまたはサブパーティションの名前。NULLの場合、表全体が再移入されます。 |
|
最新でないIMCUを強制的に割当て解除するか( |
使用上のノート
再移入中、IM列ストアには最新のIMCUと最新でないIMCUの両方が保持されます。ダブル・バッファリングと呼ばれるこのメカニズムは、再移入中にIMCUが使用できないことが原因で、問合せのパフォーマンスが低下しないようにします。再移入の完了後、IM列ストアでは、古いSCNの問合せを最適化するために、短期間(デフォルトでは2分間)最新でないIMCUが保持されます。通常はデフォルトの動作で十分です。ただし、SEGMENT_DEALLOCATE_VERSIONS
プロシージャを使用すると、最新でないIMCUを強制的に割当て解除することができます。
例
次のプログラムは、products
表の最新でないIMCUを強制的に割当て解除します。
BEGIN
DBMS_INMEMORY.SEGMENT_DEALLOCATE_VERSIONS(
schema_name => 'SH'
, table_name => 'PRODUCTS'
, spcpressure => TRUE );
END;
参照:
IM列ストアでのダブル・バッファリングについてさらに学習するには、『Oracle Database In-Memoryガイド』を参照してください。