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に変更されます。

属性がINMEMORYNO 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パッケージのサブプログラム

サブプログラム 説明

IME_DROP_EXPRESSIONSプロシージャ

指定された一連のSYS_IME仮想列を表から削除します。

POPULATEプロシージャ

指定された表を強制的に移入します。

REPOPULATEプロシージャ

指定された表を強制的に再移入します。

SEGMENT_DEALLOCATE_VERSIONSプロシージャ

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プロシージャのパラメータ

パラメータ 説明

schema_name

インメモリー表を含むスキーマの名前

table_name

SYS_IME列を含むインメモリー表の名前

column_name

SYS_IME列の名前。デフォルトでは、この値は、この表内のすべてのSYS_IME列を指定する、nullとなります。

使用上のノート

SYS_IME列を削除する一般的な理由は、領域およびパフォーマンスです。属性がINMEMORYNO 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プロシージャのパラメータ

パラメータ 説明

schema_name

スキーマの名前。

table_name

表の名前。

subobject_name

パーティションまたはサブパーティション

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プロシージャのパラメータ

パラメータ 説明

schema_name

オブジェクトを所有するスキーマの名前。

table_name

再移入を必要とする表の名前。

subobject_name

パーティションまたはサブパーティションの名前。NULLの場合、表全体が再移入されます。

force

最初の移入と同様に、セグメントのすべてのIMCUを再移入するかどうか。

次の値をforceパラメータで使用可能です。

  • FALSE: データベースにより、変更された行を含むIMCUのみが再移入されます。これはデフォルトです。

  • TRUE: データベースにより、セグメントが削除されてから再構築されます。データベースにより、統計が増分され、最初の移入に関連するその他すべてのタスクが実行されます。

たとえば、IMCU 1には行1から500,000までが含まれ、IMCU 2には行500,001から1,000,000までが含まれています。文により、行600,000が変更されます。forceFALSEの場合は、データベースにより、IMCU 2のみが再移入されます。forceTRUEの場合は、データベースにより、両方のIMCUが再移入されます。

さらにINMEMORY_VIRTUAL_COLUMNS初期化パラメータがENABLEに設定されており、アプリケーションによって新しい仮想列が作成されるとします。forceFALSEの場合は、データベースにより、新しい列とともにIMCU 2のみが再移入されます。forceTRUEの場合は、データベースにより、新しい列とともに両方のIMCUが再移入されます。

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プロシージャのパラメータ

パラメータ 説明

schema_name

オブジェクトを所有するスキーマの名前。

table_name

再移入を必要とする表の名前。

partition_name

パーティションまたはサブパーティションの名前。NULLの場合、表全体が再移入されます。

spcpressure

最新でないIMCUを強制的に割当て解除するか(TRUE)、またはデータベースにより自動的に割当て解除されるのを待機するかどうか。デフォルトでは、データベースにより、最新でないIMCUが2分ごとに割当て解除されます。

使用上のノート

再移入中、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ガイド』を参照してください。