4 インメモリー移入に対するオブジェクトの有効化

この章では、圧縮や優先順位のオプションの設定を含め、IM列ストアへの移入に対してオブジェクトを有効および無効にする方法を説明します。

この章のトピックは、次のとおりです:

4.1 インメモリー移入について

インメモリー移入(移入)は、データベースでディスクから既存の行形式データを読み取り、それを列形式に変換し、IM列ストアに格納するときに起こります。

INMEMORY属性を使用するオブジェクトのみが移入の候補となります。

この項では、次の項目について説明します。

4.1.1 インメモリー移入の目的

IM列ストアでは、データベース内のすべてのオブジェクトがIM列ストアに自動的にロードされるわけではありません。

DDLを使用してオブジェクトをINMEMORYとして指定しない場合、IM列ストアは空のままとなります。移入は、分析問合せに使用できるよう、行をユーザー指定のINMEMORYオブジェクトから列形式に変換するために必要です。

移入は、ディスク上の既存のデータを列形式に変換するものであり、新しいデータをIM列ストアにロードする、再移入とは異なります。IMCUは読取り専用の構造であるため、Oracle Databaseでは、それらは行の変更時に移入されません。正確に述べると、データベースでは、行変更がトランザクション・ジャーナルに記録されてから、再移入の一環として新しいIMCUが作成されます。

4.1.2 インメモリー移入はどのように機能するか

データベース・インスタンス起動時またはINMEMORYオブジェクトへのアクセス時のどちらかにデータベースによってオブジェクトがIM列ストアに移入されるよう指定できます。

移入アルゴリズムは、単一インスタンスまたはOracle RACのどちらを使用するかによっても異なります。

この項では、次の項目について説明します。

4.1.2.1 インメモリー移入の優先順位付け

DDL文には、移入キューをより細かく制御できるようにするINMEMORY PRIORITY副句が含まれています。

ノート:

INMEMORY PRIORITY副句は、移入の速度ではなく、移入の優先順位を制御します。

優先度レベル設定は、別々の列サブセットではなく、全体の表、パーティションまたはサブパーティションに適用されます。オブジェクト上でINMEMORY属性を設定することは、このオブジェクトがIM列ストアへの移入の候補であることを意味します。データベースでそのオブジェクトがすぐに移入されることを意味するわけではありません。

ノート:

ディスク上のセグメントが64KB以下の場合、IM列ストアに移入されません。したがって、IM列ストアに対して有効になっている小規模データベース・オブジェクトは、移入されないことがあります。

Oracle Databaseでは、次のように優先順位付けが管理されます。

  • オンデマンド移入

    デフォルトでは、INMEMORY PRIORITYパラメータはNONEに設定されています。この場合、データベースでは、オブジェクトは表の全体スキャンを通じてアクセスされるときのみ移入されます。オブジェクトがアクセスされることがないか、索引スキャンまたはROWIDによるフェッチを通じてしかアクセスされない場合は、移入が起こることはありません。

  • 優先度ベース移入

    PRIORITYNONE以外の値に設定されている場合、Oracle databaseでは、内部的に管理される優先順位キーを使用して、オブジェクトが自動的に移入されます。この場合、全体スキャンは、移入に必要な条件ではありません。データベースでは、次のことが実行されます。

    • データベース・インスタンスの再起動後に、列データをIM列ストアに自動的に移入します

    • 指定された優先度レベルに基づいて、INMEMORYオブジェクトの移入を問い合せます

      たとえば、INMEMORY PRIORITY CRITICALで変更された表はINMEMORY PRIORITY HIGHで変更された表よりも優先され、この表もまた、INMEMORY PRIORITY LOWで変更された表よりも優先されます。IM列ストアに十分な領域がない場合、Oracle Databaseは領域が使用可能になるまで追加オブジェクトを移入しません。

    • オブジェクトに対する変更がIM列ストアで記録されるまで、ALTER TABLEまたはALTER MATERIALIZED VIEW文からの返答を待機します

セグメントがIM列ストアに移入された後、データベースでそれが除去されるのは、そのセグメントが削除または移動されるか、NO INMEMORY属性で更新されるときのみです。セグメントは手動またはADOポリシーによって除去できます。

例4-1 IM列ストアへのオブジェクトの移入

この例を完了する前に、IM列ストアをデータベースに対して有効にする必要があります。

  1. データベースに管理者としてログインしてから、次のようにcustomers表を問い合せます。

    SELECT cust_id, cust_last_name, cust_first_name 
    FROM   sh.customers 
    WHERE  cust_city = 'Hyderabad' 
    AND    cust_income_level LIKE 'C%' 
    AND    cust_year_of_birth > 1960;
  2. 問合せの実行計画を表示します。

    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'+ALLSTATS'));
    SQL_ID  frgk9dbaftmm9, child number 0
    -------------------------------------
    SELECT cust_id, cust_last_name, cust_first_name FROM   sh.customers
    WHERE  cust_city = 'Hyderabad' AND    cust_income_level LIKE 'C%' AND
     cust_year_of_birth > 1960
    
    Plan hash value: 2008213504
    
    -------------------------------------------------------------------------------
    | Id| Operation         | Name      |Starts|E-Rows|A-Rows|   A-Time   |Buffers|
    -------------------------------------------------------------------------------
    |  0| SELECT STATEMENT  |           |     1|      |    6 |00:00:00.01 |   1523|
    |* 1|  TABLE ACCESS FULL| CUSTOMERS |     1|    6 |    6 |00:00:00.01 |   1523|
    -------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND
                  "CUST_INCOME_LEVEL" LIKE 'C%'))
    
  3. sh.customers表をIM列ストアへの移入のために有効にします。

    ALTER TABLE sh.customers INMEMORY;

    上の文では、デフォルトの優先順位であるNONEが使用されます。優先順位なしでオブジェクトを移入するには、全体スキャンが必要となります。

  4. sh.customers表からのデータがIM列ストアに移入されているかどうかを判断するには、次の問合せを実行します(出力例が含まれています)。

    SELECT SEGMENT_NAME, POPULATE_STATUS 
    FROM   V$IM_SEGMENTS 
    WHERE  SEGMENT_NAME = 'CUSTOMERS';
    
    no rows selected
    

    この場合、sh.customers表はまだスキャンされていないため、IM列ストアに移入されているセグメントはありません。

  5. ステップ1と同じ文を使用してsh.customersを問い合せます。

    SELECT cust_id, cust_last_name, cust_first_name 
    FROM   sh.customers 
    WHERE  cust_city = 'Hyderabad' 
    AND    cust_income_level LIKE 'C%' 
    AND    cust_year_of_birth > 1960;
    
  6. カーソルの問合せでは、データベースで全体スキャンを実行しIM列ストアにアクセスしたことが示されます。

    SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(FORMAT=>'+ALLSTATS'));
    SQL_ID  frgk9dbaftmm9, child number 0
    -------------------------------------
    SELECT cust_id, cust_last_name, cust_first_name FROM   sh.customers
    WHERE  cust_city = 'Hyderabad' AND    cust_income_level LIKE 'C%' AND
     cust_year_of_birth > 1960
    
    Plan hash value: 2008213504
    
    ---------------------------------------------------------------------------------
    | Id| Operation           | Name            |Starts|E-Rows|A-Rows|A-Time|Buffers|
    ---------------------------------------------------------------------------------
    |  0| SELECT STATEMENT           |           |    1|     | 6 |00:00:00.02| 1523 |
    |* 1|  TABLE ACCESS INMEMORY FULL| CUSTOMERS |    1|    6| 6 |00:00:00.02| 1523 |
    ---------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - inmemory(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND
                  "CUST_INCOME_LEVEL" LIKE 'C%'))
           filter(("CUST_CITY"='Hyderabad' AND "CUST_YEAR_OF_BIRTH">1960 AND
                  "CUST_INCOME_LEVEL" LIKE 'C%'))
    
  7. V$IM_SEGMENTSを再度問い合せます(出力例が含まれています)。

    COL SEGMENT_NAME FORMAT a20
    
    SELECT SEGMENT_NAME, POPULATE_STATUS 
    FROM   V$IM_SEGMENTS 
    WHERE  SEGMENT_NAME = 'CUSTOMERS';
    
    SEGMENT_NAME         POPULATE_STATUS
    -------------------- ---------------
    CUSTOMERS            COMPLETED

    POPULATE_STATUS内の値COMPLETEDは、表がIM列ストアに移入されていることを意味します。

  8. DBA_FEATURE_USAGE_STATISTICSビューでは、データベースでIM列ストアを使用して結果を取得したことを確認します。
    COL NAME FORMAT a25
    SELECT ul.NAME, ul.DETECTED_USAGES 
    FROM   DBA_FEATURE_USAGE_STATISTICS ul 
    WHERE  ul.VERSION= (SELECT MAX(u2.VERSION) 
                        FROM   DBA_FEATURE_USAGE_STATISTICS u2 
                        WHERE  u2.NAME = ul.NAME 
                        AND    ul.NAME LIKE '%Column Store%');
    
    NAME                      DETECTED_USAGES
    ------------------------- ---------------
    In-Memory Column Store    1
    

関連項目:

インメモリー移入の優先順位オプション

INMEMORY PRIORITY句について学習するには、『Oracle Database SQL言語リファレンス』を参照

4.1.2.2 バックグラウンド・プロセスによるIMCUの移入方法

移入中、データベースは、行形式でディスクからデータを読み取り、列を作成するために行をピボットし、インメモリー圧縮ユニット(IMCU)にデータを圧縮します。

ワーカー・プロセス(Wnnn)は、IM列ストアにデータを移入します。各ワーカー・プロセスは、オブジェクトのデータベース・ブロックのサブセットで動作します。移入は、データを同時に圧縮して列形式に変換する、ストリーミング・メカニズムです。

INMEMORY_MAX_POPULATE_SERVERS初期化パラメータにより、IM列ストアの移入に使用するワーカー・プロセスの最大数を指定します。デフォルト設定は、CPU_COUNTの2分の1です。このパラメータは環境に適した値に設定します。ワーカー・プロセスの数を増加すると移入は高速化しますが、より多くのCPUリソースが使用されます。ワーカー・プロセスの数を削減すると、移入が低速化し、これによりCPUオーバーヘッドは低減します。

ノート:

INMEMORY_MAX_POPULATE_SERVERS0に設定されている場合、移入は無効化されます。

関連項目:

INMEMORY_MAX_POPULATE_SERVERS初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。

4.1.3 インメモリー移入の制御

INMEMORY句をデータ定義言語(DDL)文で使用して、IM列ストアへの移入の対象となるオブジェクトを指定します。表領域、表、パーティションおよびマテリアライズド・ビューを使用可能にできます。

この項では、次の項目について説明します。

4.1.3.1 INMEMORY副句

INMEMORYはセグメントレベルの属性で、列レベルの属性ではありません。ただし、INMEMORY属性を、指定したオブジェクト内の列のサブセットに適用できます。

IM列ストアに対するオブジェクトを有効化または無効化するには、次のいずれかの文でINMEMORY句を指定します。

  • CREATE TABLESPACEまたはALTER TABLESPACE

    デフォルトで、表領域内の表およびマテリアライズド・ビューはすべてIM列ストアに対して有効です。表領域内の個々の表およびマテリアライズド・ビューには、異なるINMEMORY属性がある場合があります。個々のデータベース・オブジェクトの属性は、表領域の属性をオーバーライドします。

  • CREATE TABLEまたはALTER TABLE

    デフォルトでは、IM列ストアは表内のすべての非仮想列を移入します。表の列のすべてまたはサブセットを指定できます。たとえば、oe.product_informationweight_class列およびcatalog_url列を適格性から除外する場合があります。パーティション表の場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。デフォルトで、パーティション表の場合、すべての表パーティションがINMEMORY属性を継承します。

  • CREATE MATERIALIZED VIEWまたはALTER MATERIALIZED VIEW

    パーティション・マテリアライズド・ビューの場合、IM列ストア内のパーティションのすべて、またはサブセットを移入できます。

DBA_TABLESビューのINMEMORY列は、どの表にINMEMORY属性が設定されている(ENABLED)か、または設定されていない(DISABLED)かを示します。

次のオブジェクトは、IM列ストアへの移入の対象ではありません。

  • 索引

  • 索引構成表

  • ハッシュ・クラスタ

  • SYSユーザーに所有されているか、SYSTEMまたはSYSAUX表領域内に格納されているオブジェクト

IM列ストアに対して表を有効化し、それに次のようなタイプの列が含まれる場合、これらの列はIM列ストアに移入されません。

  • 表外格納列(VARRAY、ネストした表の列、およびアウトラインLOB)

  • LONGまたはLONG RAWデータ型を使用する列

  • 拡張データ型の列

例4-2 表のINMEMORYとしての指定

データベースにユーザーshとして接続していると仮定します。FOR QUERY LOWのデフォルト圧縮レベルを使用して、IM列ストアへの移入に対してcustomers表を有効化します(インメモリー圧縮を参照)。

SQL> SELECT TABLE_NAME, INMEMORY FROM USER_TABLES WHERE TABLE_NAME = 'CUSTOMERS';

TABLE_NAME INMEMORY
---------- --------
CUSTOMERS  DISABLED

SQL> ALTER TABLE customers INMEMORY;

Table altered.

SQL> SELECT TABLE_NAME, INMEMORY, INMEMORY_COMPRESSION FROM USER_TABLES WHERE TABLE_NAME='CUSTOMERS';

TABLE_NAME INMEMORY INMEMORY_COMPRESS
---------- -------- -----------------
CUSTOMERS  ENABLED  FOR QUERY LOW
4.1.3.2 インメモリー移入の優先順位オプション

IM列ストアに対してオブジェクトを有効にする場合、オブジェクトを移入するタイミングをOracle Databaseで制御することも(デフォルト)、移入キューでのオブジェクトの優先度を決定するレベルを指定することもできます。

Oracle SQLには、移入のためにキューをより細かく制御できるようにするINMEMORY PRIORITY句が組み込まれています。たとえば、あるデータベース・オブジェクトのデータを移入してから他のデータベース・オブジェクトのデータを移入することが、重要になったり重要でなくなったりすることがあります。

ビデオ:

次の表では、サポートされている優先度レベルを説明します。

表4-1 IM列ストアにデータベース・オブジェクトを移入するための優先度レベル

CREATE/ALTERの構文 説明

PRIORITY NONE

データベースでは、要求された場合のみオブジェクトが移入されます。データベース・オブジェクトの全体スキャンによって、IM列ストアへのオブジェクトの移入がトリガーされます。

これは、PRIORITYINMEMORY句に指定されていない場合のデフォルト・レベルです。

PRIORITY LOW

データベースにより、オブジェクトに低い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。

オブジェクトは、優先度レベルがNONEのデータベース・オブジェクトより前に、IM列ストアに移入されます。データベース・オブジェクトのデータは、優先度レベルがMEDIUMHIGHまたはCRITICALのデータベース・オブジェクトより後に、IM列ストアに移入されます。

PRIORITY MEDIUM

データベースにより、オブジェクトに中間の優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。

データベース・オブジェクトは、優先度レベルがNONEまたはLOWのデータベース・オブジェクトより前に、IM列ストアに移入されます。データベース・オブジェクトのデータは、優先度レベルがHIGHまたはCRITICALのデータベース・オブジェクトより後に、IM列ストアに移入されます。

PRIORITY HIGH

データベースにより、オブジェクトに高い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。

データベース・オブジェクトのデータは、優先度レベルがNONELOWまたはMEDIUMのデータベース・オブジェクトより前に、IM列ストアに移入されます。データベース・オブジェクトのデータは、優先度レベルがCRITICALのデータベース・オブジェクトより後に、IM列ストアに移入されます。

PRIORITY CRITICAL

データベースにより、オブジェクトに低い優先順位が割り当てられ、キュー内のその位置に基づいて、起動後にそれが移入されます。移入には、オブジェクトがアクセスされるかどうかは関係ありません。

データベース・オブジェクトのデータは、優先度レベルがNONELOWMEDIUMまたはHIGHのデータベース・オブジェクトより前に、IM列ストアに移入されます。

複数のデータベース・オブジェクトの優先度レベルがNONE以外である場合、Oracle Databaseでは、優先度レベルに基づいて移入するオブジェクトのデータをキューに入れます。CRITICAL優先度レベルのデータベース・オブジェクトが最初に移入され、HIGH優先度レベルのデータベース・オブジェクトが次に移入される、といったようになります。IM列ストアに領域が残っていない場合、領域が使用できるようになるまで、他のオブジェクトは移入されません。

ノート:

すべてのオブジェクトをCRITICALとして指定した場合、データベースでは、どのオブジェクトも他より重要とはみなされません。

データベースを再起動すると、優先度レベルがNONE以外のデータベース・オブジェクトのデータはすべて起動時にIM列ストアに移入されます。優先度レベルがNONE以外のデータベース・オブジェクトの場合、そのデータベース・オブジェクトが含指定されているALTER TABLEまたはALTER MATERIALIZED VIEW DDL文は、IM列ストアでDDLの変更が記録されるまで戻りません。

ノート:

  • 優先度レベル設定は、表全体または表パーティションに適用する必要があります。表内の列のサブセットごとに異なるIM列ストア優先度レベルを指定することはできません。

  • ディスク上のセグメントが64KB以下の場合、IM列ストアに移入されません。したがって、IM列ストアに対して有効になっている小規模データベース・オブジェクトは、移入されないことがあります。

関連項目:

4.1.3.3 IM列ストアの圧縮方法

要件に応じて、様々なレベルでインメモリー・オブジェクトを圧縮できます。

一般には、圧縮は領域を節約するメカニズムです。ただし、IM列ストアでは、問合せパフォーマンスも向上させる新しい一連のアルゴリズムを使用して、データを圧縮できます。FOR DMLまたはFOR QUERYオプションを使用して列データが圧縮される場合、SQL問合せは、圧縮されたデータに対して直接実行します。そのため、スキャンおよびフィルタ操作は、非常に少量のデータに対して行います。データベースでは、結果セットに必要な場合のみ、データが解凍されます。

ビデオ:

V$IM_SEGMENTSおよびV$IM_COLUMN_LEVELビューでは、現在の圧縮レベルが示されます。適切なALTERコマンドを使用することで、圧縮レベルを変更できます。表が現在IM列ストアに移入されており、PRIORITY以外の表のINMEMORY属性を変更した場合は、データベースでその表がIM列ストアから除去されます。再移入の動作は、PRIORITY設定によって異なります。

次の表に、IM列ストアでサポートされているデータ圧縮方法をまとめます。

表4-2 IM列ストアの圧縮方法

CREATE/ALTERの構文 説明

NO MEMCOMPRESS

データは圧縮されません。

MEMCOMPRESS FOR DML

この方法では、DMLのパフォーマンスが最適になります。

この方法では、NO MEMCOMPRESSを例外として、IM列ストアが最も小さく圧縮されます。

ノート:

この圧縮方法は、Exadataフラッシュ・キャッシュのCELLMEMORY記憶域ではサポートされません。

MEMCOMPRESS FOR QUERY LOW

この方法は、問合せパフォーマンスが最適になります。

IM列ストア・データの圧縮は、MEMCOMPRESS FOR DMLを上回りますが、MEMCOMPRESS FOR QUERY HIGHを下回ります。

この方法は、CREATEまたはALTER SQL文に圧縮方法を指定せずにINMEMORY句が指定されている場合またはLOWまたはHIGHのいずれかを指定せずにMEMCOMPRESS FOR QUERYが指定されている場合のデフォルトです。

MEMCOMPRESS FOR QUERY HIGH

この方法では、問合せパフォーマンスが向上し、領域が節約されます。

IM列ストアデータの圧縮は、MEMCOMPRESS FOR QUERY LOWを上回りますが、MEMCOMPRESS FOR CAPACITY LOWを下回ります。

MEMCOMPRESS FOR CAPACITY LOW

この方法では、領域節約になるような方向で、領域節約と問合せパフォーマンスのバランスがとられます。

IM列ストア・データの圧縮は、MEMCOMPRESS FOR QUERY HIGHを上回りますが、MEMCOMPRESS FOR CAPACITY HIGHを下回ります。この方法では、Oracle Zip (OZIP)という独自の圧縮技術が適用されます。これにより、Oracle Database専用に調整されている、非常に高速な解凍が提供されます。そのデータは、スキャンするより前に解凍する必要があります。

この方法は、LOWまたはHIGHのいずれかを指定せずにMEMCOMPRESS FOR CAPACITYが指定されている場合のデフォルトです。

MEMCOMPRESS FOR CAPACITY HIGH

この方法では、最も優れた領域節約がもたらされます。

IM列ストア・データを最も大きく圧縮します。

SQL文では、MEMCOMPRESSキーワードの前にINMEMORYキーワードがある必要があります。

関連項目:

4.1.3.4 Oracle Compression Advisor

Oracle Compression AdvisorではMEMCOMPRESS句を使用してユーザーが実感できる圧縮率を推定します。アドバイザはDBMS_COMPRESSIONインタフェースを使用します。

表に対してDBMS_COMPRESSION.GET_COMPRESSION_RATIOを実行すると、Oracle Databaseにより、行のサンプルが分析されます。このため、Oracle Compression Advisorでは、IM列ストアに移入された後に表が得られる圧縮結果について、適切な見積りが提供されます。

関連項目:

DBMS_COMPRESSION.GET_COMPRESSION_RATIOについて学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

4.2 IM列ストアに対する表の有効化および無効化

IM列ストアに対して表を有効にするには、CREATE TABLEまたはALTER TABLE文でINMEMORY句を指定します。IM列ストアに対して表を無効にするには、CREATE TABLEまたはALTER TABLE文でNO INMEMORY句を指定します。

この項では、次の項目について説明します。

4.2.1 インメモリー列ストアに対する新しい表の有効化

新しい表をIM列ストアに対して有効にするには、CREATE TABLE文でINMEMORY句を指定します。

前提条件

IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。

新しい表をIM列ストアに対して有効にするには:

  1. 表の作成に必要な権限があるユーザーとして、データベースにログインします。

  2. INMEMORY句またはNO INMEMORY句を指定してCREATE TABLE文を実行します。

4.2.2 IM列ストアに対する既存の表の有効化および無効化

既存の表をIM列ストアに対して有効または無効にするには、ALTER TABLE文でINMEMORY句またはNO INMEMORY句を指定します。

前提条件

IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。

IM列ストアに対して既存の表を有効または無効にするには:

  1. ALTER TABLE権限のあるユーザーとしてデータベースにログインします。

  2. INMEMORY句またはNO INMEMORY句を指定してALTER TABLE文を実行します。

  3. 必要な場合は、インメモリー・セグメントに関するメタデータ(サイズ、優先順位、圧縮レベル)を表示するために、V$IM_SEGMENTSを問い合せます。

4.2.3 IM列ストアに対する表の有効化および無効化: 例

次の例では、IM列ストアに対して表を有効化または無効化する方法を示します。

例4-3 表の作成とIM列ストアに対する有効化

次の例では、test_inmem表を作成し、IM列ストアに対して有効にします。

CREATE TABLE test_inmem (
     id        NUMBER(5) PRIMARY KEY,
     test_col  VARCHAR2(15))
  INMEMORY;

この例では、INMEMORY句のデフォルトであるMEMCOMPRESS FOR QUERYおよびPRIORITY NONEを使用します。

例4-4 IM列ストアに対する表の有効化

次のDDL文では、IM列ストアに対してsh.sales表が有効になります。

ALTER TABLE sh.sales INMEMORY;

上の文では、INMEMORY句のデフォルトであるMEMCOMPRESS FOR QUERYおよびPRIORITY NONEが使用されます。

次の問合せでは、salesの全体スキャンが引き起こされ、それにより、表がIM列ストアに移入されます。

SELECT /*+ FULL(sales) NO_PARALLEL(sales) */ COUNT(*) FROM sh.sales;

次の問合せでは、salesの移入ステータスが示されます(出力例が含まれています)。

COL OWNER FORMAT a3
COL NAME FORMAT a10
COL STATUS FORMAT a20

SELECT OWNER, SEGMENT_NAME NAME, 
       POPULATE_STATUS STATUS
FROM   V$IM_SEGMENTS;

OWN NAME       STATUS
--- ---------- --------------------
SH  SALES      COMPLETED

次の問合せでは、圧縮率が計算されます。この問合せは、表がディスク上でさらに圧縮されていないことが前提となります。

COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a5
SET PAGESIZE 50000

SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
       v.INMEMORY_SIZE IN_MEM_SIZE,
       ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM   V$IM_SEGMENTS v
ORDER BY 4;

OWNER SEGME  ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ----- ---------- ----------- ----------
SH    SALES     851968     1310720        .65
SH    SALES     835584     1310720        .64
SH    SALES     925696     1310720        .71
SH    SALES     958464     1310720        .73
SH    SALES     950272     1310720        .73
SH    SALES     786432     1310720         .6
SH    SALES     876544     1310720        .67
SH    SALES     753664     1310720        .58
SH    SALES    1081344     1310720        .83
SH    SALES     901120     1310720        .69
SH    SALES     925696     1310720        .71
SH    SALES     933888     1310720        .71
SH    SALES     843776     1310720        .64
SH    SALES     999424     1310720        .76
SH    SALES     581632     1507328        .39
SH    SALES     696320     1507328        .46

16 rows selected.

例4-5 FOR CAPACITY LOW圧縮を指定したIM列ストアに対する表の有効化

次のDDL文では、IM列ストアに対してoe.product_information表を有効にし、圧縮方法FOR CAPACITY LOWを指定します。

ALTER TABLE oe.product_information 
  INMEMORY 
  MEMCOMPRESS FOR CAPACITY LOW;

上のDDL文では、PRIORITY句のデフォルトであるNONEが使用されます。次の問合せでは、oe.product_information表がスキャンされて移入されます(出力例が含まれています)。

SELECT /*+ FULL(p) NO_PARALLEL(p) */ COUNT(*) 
FROM   oe.product_information p;

  COUNT(*)
----------
       288

次の問合せでは、圧縮率が計算されます(出力例が含まれています)。

COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000

SELECT v.OWNER, v.SEGMENT_NAME, v.BYTES ORIG_SIZE,
       v.INMEMORY_SIZE IN_MEM_SIZE,
       ROUND(v.BYTES / v.INMEMORY_SIZE, 2) COMP_RATIO
FROM   V$IM_SEGMENTS v
WHERE  SEGMENT_NAME LIKE 'P%'
ORDER BY 4;

OWNER SEGMENT_NAME         ORIG_SIZE IN_MEM_SIZE COMP_RATIO
----- ------------------- ---------- ----------- ----------
OE    PRODUCT_INFORMATION      98304     1310720        .08

例4-6 HIGHデータ移入優先度を指定したIM列ストアに対する表の有効化

次のDDL文では、IM列ストアに対してoe.product_information表を有効にし、表データをIM列ストアに移入するためにPRIORITY HIGHを指定します。

ALTER TABLE 
  oe.product_information 
  INMEMORY 
  PRIORITY HIGH;

例4-7 FOR CAPACITY HIGH圧縮およびLOWデータ移入優先度を指定したIM列ストアに対する表の有効化

次の問合せでは、oe.product_information表の優先順位および圧縮設定が示されます。

COL OWNER FORMAT a5
COL SEGMENT_NAME FORMAT a19
SET PAGESIZE 50000

SELECT v.OWNER, v.SEGMENT_NAME, v.INMEMORY_PRIORITY,
       v.INMEMORY_COMPRESSION
FROM   V$IM_SEGMENTS v
WHERE  SEGMENT_NAME LIKE 'P%';

OWNER SEGMENT_NAME        INMEMORY INMEMORY_COMPRESS
----- ------------------- -------- -----------------
OE    PRODUCT_INFORMATION HIGH     FOR CAPACITY LOW

次のDDL文では、oe.product_informationが、FOR CAPACITY HIGH表圧縮およびPRIORITY LOWを使用するよう変更されます。

ALTER TABLE oe.product_information 
  INMEMORY 
  MEMCOMPRESS FOR CAPACITY HIGH 
  PRIORITY LOW;

例4-8 IM列ストアに対するパーティション表の有効化

この次のDDL文では、range_salesというパーティション表が作成され、IM列ストア内の最初の3つのパーティションに対して異なる圧縮レベルが指定されます。最後の2つのパーティションは、IM列ストアに移入されません。

CREATE TABLE range_sales
    ( prod_id        NUMBER(6)
    , cust_id        NUMBER
    , time_id        DATE
    , channel_id     CHAR(1)
    , promo_id       NUMBER(6)
    , quantity_sold  NUMBER(3)
    , amount_sold    NUMBER(10,2)
    ) 
PARTITION BY RANGE (time_id)
  (PARTITION SALES_Q4_1999 
      VALUES LESS THAN (TO_DATE('01-JAN-2015','DD-MON-YYYY'))
      INMEMORY MEMCOMPRESS FOR DML,
   PARTITION SALES_Q1_2000 
      VALUES LESS THAN (TO_DATE('01-APR-2015','DD-MON-YYYY'))
      INMEMORY MEMCOMPRESS FOR QUERY,
   PARTITION SALES_Q2_2000 
      VALUES LESS THAN (TO_DATE('01-JUL-2015','DD-MON-YYYY'))
      INMEMORY MEMCOMPRESS FOR CAPACITY,
   PARTITION SALES_Q3_2000 
      VALUES LESS THAN (TO_DATE('01-OCT-2015','DD-MON-YYYY'))
      NO INMEMORY,
   PARTITION SALES_Q4_2000 
      VALUES LESS THAN (MAXVALUE));

例4-9 IM列ストアに対する表の無効化

IM列ストアに対して表を無効にするには、NO INMEMORY句を指定します。次の例では、IM列ストアに対してoe.product_information表を無効にします。

ALTER TABLE oe.product_information NO INMEMORY;

V$IM_SEGMENTSビューを問い合せると、IM列ストアに移入されているデータベース・オブジェクトをリストできます。

4.3 インメモリー表に対する列の有効化および無効化

INMEMORY句を個々の列に対して指定できます。非仮想列およびインメモリー仮想列(IM仮想列)はどちらも、IM列ストアへの移入の対象となります。

この項では、次の項目について説明します。

4.3.1 IM仮想列について

IM仮想列は、式を評価することによってその値が導出されること以外は、他の任意の列と同じです。

事前に計算されたIM仮想列の値をIM列ストアに格納すると、問合せのパフォーマンスが向上する可能性があります。式には、同じ表からの列、制約、SQL関数およびユーザー定義PL/SQL関数(DETERMINISTICのみ)を含めることができます。IM仮想列に明示的に書き込むことはできません。

ノート:

仮想列またはIM式は、移入されたオブジェクトごとの列の上限である1000個に数えられます。

IM列ストアにIM仮想列を移入するには、INMEMORY_VIRTUAL_COLUMNS初期化パラメータを次のいずれかの値に設定します。

  • MANUAL (デフォルト): 表がIM列ストアに対して有効になっている場合、この表で定義されているIM仮想列は、明示的にINMEMORYとして設定されていないかぎり、移入の対象ではありません。

  • ENABLE: 表がIM列ストアに対して有効になっている場合、この表で定義されているすべてのIM仮想列は、明示的にNO INMEMORYとして設定されていないかぎり、移入の対象となります。

    デフォルトでは、IM列ストア内の列の圧縮レベルは、それが格納されている表またはパーティションと同じです。ただし、IM仮想列に対して異なる圧縮レベルが指定されている場合、それは指定された圧縮レベルで移入されます。

IM列ストアにIM仮想列が移入されないよう指定するには、この初期化パラメータをDISABLEに設定します。

IM仮想列およびIM式の基礎となる記憶域構造は同じです。ただし、IM式およびIM仮想列は異なるメカニズムで制御されます。

ノート:

  • IM列ストアでは、INMEMORYとマークされている表の仮想列のみが移入されます。

  • IM列ストアにIM仮想列を移入するには、COMPATIBLE初期化パラメータの値が12.1.0以上に設定されている必要があります。

4.3.2 IM仮想列の有効化

IM仮想列により、計算の繰返しをなくすことで、問合せのパフォーマンスが向上します。また、データベースはSIMDベクター処理などの手法を使用してIM仮想列をスキャンおよびフィルタリングできます。

前提条件

IM仮想列を有効にするには、次の条件を満たしている必要があります。

IM仮想列を有効にするには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. INMEMORY_VIRTUAL_COLUMNS初期化パラメータをENABLEに設定するか、特定の仮想列をIM列ストアに対して有効にします。

例4-10 IM列ストアに対する仮想列の有効化

この例では、SYSTEMとしてデータベースにログインしています。IM列ストアは有効化されていますが、仮想列の移入は現在無効化されています。

SQL> SHOW PARAMETER INMEMORY_SIZE

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----
inmemory_size                        big integer 200M

SQL> SHOW PARAMETER INMEMORY_VIRTUAL_COLUMNS

NAME                                 TYPE        VALUE
------------------------------------ ----------- -------
inmemory_virtual_columns             string      DISABLE

仮想列をhr.employees表に追加してから、その表がINMEMORYであると指定します。

SQL> ALTER TABLE hr.employees ADD (weekly_sal AS (ROUND(salary*12/52,2)));

Table altered.

SQL> ALTER TABLE hr.employees INMEMORY;

Table altered.

この段階では、weekly_salは移入の対象ではありませんが、hr.employees内の非仮想列は移入の対象となっています。次の文により、weekly_sal、およびhr.employees内の他の仮想列が移入されるようになります。

SQL> ALTER SYSTEM SET INMEMORY_VIRTUAL_COLUMNS=ENABLE SCOPE=BOTH;

System altered.

SCOPE=SPFILEを使用することもできますが、その場合、変更は次にデータベースを再起動するまで有効になりません。SCOPE=BOTHを使用すると、変更はただちに行われ、再起動は必要ありません。

例4-11 IM列ストアに対する特定のIM仮想列の有効化

この例では、INMEMORY_VIRTUAL_COLUMNS初期化パラメータがMANUALに設定され、IM列ストアにIM仮想列を明示的に追加する必要があることを前提としています。この例では、最初にhr.admin_emp表を作成します。

CREATE TABLE hr.admin_emp (
      empno      NUMBER(5) PRIMARY KEY,
      ename      VARCHAR2(15) NOT NULL,
      job        VARCHAR2(10),
      sal        NUMBER(7,2),
      hrly_rate  NUMBER(7,2) GENERATED ALWAYS AS (sal/2080),
      deptno     NUMBER(3) NOT NULL)
   INMEMORY;

この段階では、hrly_rate仮想列は、移入の対象ではありません。次の文では、その仮想列がINMEMORYとして明示的に指定されます。

ALTER TABLE hr.admin_emp INMEMORY(hrly_rate);

4.3.3 IM列ストアに対する列のサブセットの有効化: 例

この例では、IM列ストアに対してoe.product_information表のすべての列を有効にしますが、weight_classおよびcatalog_urlは例外です。

また、次の文は、IM列ストアに対して有効な列に、別のIM列ストア圧縮方法を指定します。

ALTER TABLE oe.product_information  
   INMEMORY MEMCOMPRESS FOR QUERY (
      product_id, product_name, category_id, supplier_id, min_price)
   INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (
      product_description, warranty_period, product_status, list_price)
   NO INMEMORY (
      weight_class, catalog_url);

具体的には、前述の文は次のように指定します。

  • product_idproduct_namecategory_id supplier_idおよびmin_priceの各列は、MEMCOMPRESS FOR QUERY圧縮方法を使用してIM列ストアに対して有効になります。

  • product_descriptionwarranty_periodproduct_statusおよびlist_priceの各列は、MEMCOMPRESS FOR CAPACITY HIGH圧縮方法を使用してIM列ストアに対して有効になります

  • weight_class列およびcatalog_url列は、IM列ストアに対して有効になりません。

  • 表では、PRIORITY句のデフォルトであるPRIORITY NONEが使用されます。

ノート:

優先度レベル設定は、表全体またはパーティションに適用する必要があります。表の列のサブセットごとに異なるIM列ストアの優先度レベルを指定することはできません。

データベース・オブジェクトに対して定義されている、選択された列圧縮レベルを判断するには、次の例で示すようにV$IM_COLUMN_LEVELビューを問い合せます。

COL TABLE_NAME FORMAT a20
COL COLUMN_NAME FORMAT a20

SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION 
FROM   V$IM_COLUMN_LEVEL 
WHERE  TABLE_NAME = 'PRODUCT_INFORMATION'
ORDER BY COLUMN_NAME;

TABLE_NAME           COLUMN_NAME          INMEMORY_COMPRESSION
-------------------- -------------------- --------------------------
PRODUCT_INFORMATION  CATALOG_URL          NO INMEMORY
PRODUCT_INFORMATION  CATEGORY_ID          FOR QUERY LOW
PRODUCT_INFORMATION  LIST_PRICE           FOR CAPACITY HIGH
PRODUCT_INFORMATION  MIN_PRICE            FOR QUERY LOW
PRODUCT_INFORMATION  PRODUCT_DESCRIPTION  FOR CAPACITY HIGH
PRODUCT_INFORMATION  PRODUCT_ID           FOR QUERY LOW
PRODUCT_INFORMATION  PRODUCT_NAME         FOR QUERY LOW
PRODUCT_INFORMATION  PRODUCT_STATUS       FOR CAPACITY HIGH
PRODUCT_INFORMATION  SUPPLIER_ID          FOR QUERY LOW
PRODUCT_INFORMATION  WARRANTY_PERIOD      FOR CAPACITY HIGH
PRODUCT_INFORMATION  WEIGHT_CLASS         NO INMEMORY

関連項目:

4.3.4 NO INMEMORY表でのINMEMORY列属性の指定: 例

Oracle Database 12cリリース2 (12.2)以降では、まだINMEMORYとして指定されていないオブジェクト上で、列レベルでINMEMORY句を指定できます。

以前のリリースでは、列レベルのINMEMORY句は、INMEMORY表またはパーティションで指定されている場合のみ有効でした。この制限は、表またはパーティションにINMEMORY句を関連付ける前に、列にINMEMORY句を関連付けることはできないことを意味します。

Oracle Database 12cリリース2 (12.2)以降では、INMEMORY句を列レベルで指定した場合、データベースで、指定された列の属性が記録されます。表がNO INMEMORY (デフォルト)の場合、表またはパーティションがINMEMORYとして指定されるまで、列レベルの属性は、表を問い合せる方法には影響しません。表自体をNO INMEMORYとしてマークした場合は、データベースにより、既存の列レベル属性が削除されます。

この例での目的は、パーティション表内の列c3がIM列ストアに移入されないようにすることです。次のステップを実行します。

  1. 次のように、パーティション表tを作成します。

    CREATE TABLE t (c1 NUMBER, c2 NUMBER, c3 NUMBER) 
      NO INMEMORY -- this clause specifies the table itself as NO INMEMORY
      PARTITION BY LIST (c1) 
        ( PARTITION p1 VALUES (0), 
          PARTITION p2 VALUES (1), 
          PARTITION p3 VALUES (2) );

    tNO INMEMORYです。この表は、列c1上のリストによってパーティション化されており、p1p2およびp3という3つのパーティションを含んでいます。

  2. 表内の列の圧縮を問い合せます(出力例が含まれています)。

    COL TABLE_NAME FORMAT a20
    COL COLUMN_NAME FORMAT a20
    
    SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
    FROM   V$IM_COLUMN_LEVEL
    WHERE  TABLE_NAME = 'T'
    ORDER BY COLUMN_NAME;
    
    no rows selected

    出力で示されているように、列レベルのINMEMORY属性は設定されていません。

  3. c3が移入されないようにするには、NO INMEMORY属性を列c3に適用します。

    ALTER TABLE t NO INMEMORY (c3);
  4. 表内の列の圧縮を問い合せます(出力例が含まれています)。

    SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
    FROM   V$IM_COLUMN_LEVEL
    WHERE  TABLE_NAME = 'T'
    ORDER BY COLUMN_NAME;
    
    TABLE_NAME           COLUMN_NAME          INMEMORY_COMPRESSION
    -------------------- -------------------- --------------------
    T                    C1                   DEFAULT
    T                    C2                   DEFAULT
    T                    C3                   NO INMEMORY

    データベースでは、c3NO INMEMORY属性が記録されています。他の列では、デフォルトの圧縮が使用されます。

  5. パーティションp3INMEMORYとして指定します。

    ALTER TABLE t 
      MODIFY PARTITION p3 
        INMEMORY PRIORITY CRITICAL;

    c3は前にNO INMEMORYとして指定されているため、パーティションp3の最初の移入には、列c3は含まれません。

  6. 表全体をINMEMORYとして指定します。

    ALTER TABLE t INMEMORY;
  7. 表内の列の圧縮を問い合せます(出力例が含まれています)。

    SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
    FROM   V$IM_COLUMN_LEVEL
    WHERE  TABLE_NAME = 'T'
    ORDER BY COLUMN_NAME;
    
    TABLE_NAME           COLUMN_NAME          INMEMORY_COMPRESSION
    -------------------- -------------------- --------------------------
    T                    C1                   DEFAULT
    T                    C2                   DEFAULT
    T                    C3                   NO INMEMORY

    データベースでは、列c3NO INMEMORY設定が保持されています。他の列では、デフォルトの圧縮が使用されます。

  8. 異なる圧縮レベルを列c1およびc2に適用します。
    ALTER TABLE t 
      INMEMORY MEMCOMPRESS FOR CAPACITY HIGH (c1) 
      INMEMORY MEMCOMPRESS FOR CAPACITY LOW (c2);
  9. 表内の列の圧縮を問い合せます(出力例が含まれています)。

    SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
    FROM   V$IM_COLUMN_LEVEL
    WHERE  TABLE_NAME = 'T'
    ORDER BY COLUMN_NAME;
    
    TABLE_NAME           COLUMN_NAME          INMEMORY_COMPRESSION
    -------------------- -------------------- --------------------------
    T                    C1                   FOR CAPACITY HIGH
    T                    C2                   FOR CAPACITY LOW
    T                    C3                   NO INMEMORY

    これで、各列に異なる圧縮レベルが設定されました。

  10. 表全体をNO INMEMORYとして指定します。

    ALTER TABLE t NO INMEMORY;
  11. 表内の列の圧縮を問い合せます(出力例が含まれています)。

    SELECT TABLE_NAME, COLUMN_NAME, INMEMORY_COMPRESSION
    FROM   V$IM_COLUMN_LEVEL
    WHERE  TABLE_NAME = 'T'
    ORDER BY COLUMN_NAME;
    
    no rows selected

    表全体がNO INMEMORYとして指定されたため、データベースにより、列レベルのすべてのINMEMORY属性が削除されました。

関連項目:

ALTER TABLEの構文およびセマンティクスは、『Oracle Database SQL言語リファレンス』を参照してください。

4.4 IM列ストアに対する表領域の有効化および無効化

IM列ストアに対する表領域を有効化または無効化できます。

INMEMORY句を指定したCREATE TABLESPACE文を使用して表領域を作成する際に、IM列ストアに対して表領域を有効にします。また、INMEMORY句を指定したALTER TABLESPACE文を使用して、IM列ストアに対して有効になるように表領域を変更できます。

IM列ストアに対して表領域を無効にするには、CREATE TABLESPACE文またはALTER TABLESPACE文にNO INMEMORY句を指定します。

IM列ストアに対して表領域が有効になっている場合、表領域内の表およびマテリアライズド・ビューはすべて、デフォルトでIM列ストアに対して有効になります。INMEMORY句は、表、マテリアライズド・ビューおよび表領域の場合と同じです。DEFAULT記憶域句は、IM列ストアに対して表領域を有効にする場合はINMEMORY句の前に、IM列ストアに対して表領域を無効にする場合はNO INMEMORY句の前に必要です。

IM列ストアに対して表領域が有効になっている場合、表領域内の個々の表およびマテリアライズド・ビューに異なるインメモリー設定を指定でき、個々のデータベース・オブジェクトの設定は表領域の設定を上書きします。たとえば、メモリーにデータを移入するために表領域がPRIORITY LOWに設定されているのに対し、表領域内の表がPRIORITY HIGHに設定されている場合、その表ではPRIORITY HIGHを使用します。

前提条件

IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。

IM列ストアに対する表領域を有効化または無効化にします。

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. INMEMORY句またはNO INMEMORY句を指定して、CREATE TABLESPACEまたはALTER TABLESPACE文を実行します。

例4-12 表領域の作成とIM列ストアに対する有効化

次の例では、users01表領域を作成し、IM列ストアに対して有効にします。

CREATE TABLESPACE users01 
   DATAFILE 'users01.dbf' SIZE 40M 
   ONLINE
   DEFAULT INMEMORY;

この例では、INMEMORY句にデフォルトを使用しています。したがって、MEMCOMPRESS FOR QUERYおよびPRIORITY NONEが使用されます。

例4-13 表領域の変更とIM列ストアに対する有効化

次の例では、IM列ストアに対して有効になるようにusers01表領域を変更し、表領域内のデータベース・オブジェクトに対してFOR CAPACITY HIGH圧縮を指定し、メモリーにデータを移入するためにPRIORITY LOWを指定します。

ALTER TABLESPACE users01 DEFAULT INMEMORY 
   MEMCOMPRESS FOR CAPACITY HIGH 
   PRIORITY LOW;

4.5 IM列ストアに対するマテリアライズド・ビューの有効化および無効化

IM列ストアに対してマテリアライズド・ビューを有効および無効にすることができます。

IM列ストアに対してマテリアライズド・ビューを有効にするには、CREATE MATERIALIZED VIEWまたはALTER MATERIALIZED VIEW文でINMEMORY句を使用します。IM列ストアに対してマテリアライズド・ビューを無効にするには、CREATE MATERIALIZED VIEWまたはALTER MATERIALIZED VIEW文でNO INMEMORY句を使用します。

前提条件

IM列ストアがデータベースに対して有効になっていることを確認します。「データベースに対するIM列ストアの有効化」を参照してください。

IM列ストアに対してマテリアライズド・ビューを有効または無効にするには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. INMEMORY句またはNO INMEMORY句を指定して、CREATE MATERIALIZED VIEWまたはALTER MATERIALIZED VIEW文を実行します。

例4-14 マテリアライズド・ビューの作成とIM列ストアに対する有効化

次の文では、oe.prod_info_mvマテリアライズド・ビューを作成し、IM列ストアに対して有効にします。

CREATE MATERIALIZED VIEW oe.prod_info_mv INMEMORY 
  AS SELECT * FROM oe.product_information;

この例では、INMEMORY句のデフォルトであるMEMCOMPRESS FOR QUERY LOWおよびPRIORITY NONEを使用します。

例4-15 HIGHデータ移入優先度を指定したIM列ストアに対するマテリアライズド・ビューの有効化

次の文では、IM列ストアに対してoe.prod_info_mvマテリアライズド・ビューを有効にします。

ALTER MATERIALIZED VIEW oe.prod_info_mv INMEMORY PRIORITY HIGH;

この例では、デフォルトの圧縮であるMEMCOMPRESS FOR QUERY LOWを使用します。

関連項目:

CREATEまたはALTER MATERIALIZED VIEW文についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照してください。

4.6 インメモリー・オブジェクトの初期移入の強制: チュートリアル

インメモリー移入に対してオブジェクトを有効にしても、オブジェクトはすぐには移入されません。

PRIORITYNONEに設定してオブジェクトを有効にし、それをすぐに移入する必要がある場合には、次の選択肢があります。
  • 表の全体スキャンを強制的に実行する

  • DBMS_INMEMORY.POPULATEプロシージャを使用する

前提

このチュートリアルでは、次のことが前提となっています。

  • IM列ストアが有効になっている。

  • PRIORITYのデフォルトであるNONEを使用して、sh.customers表をインメモリー移入に対して有効にする必要がある。

  • IM列ストアへのsh.customersの即時移入を強制的に実行する必要がある。

INMEMORY表の移入を強制的に実行するには:

  1. SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。

  2. INMEMORY属性を表に適用します。

    たとえば、次のようにsh.customersをIM移入のために有効にします。

    ALTER TABLE sh.customers INMEMORY;
    
  3. 必要な場合は、移入ステータスを確認するために、V$IM_SEGMENTSを問い合せます。

    たとえば、次の文を使用します(出力例が含まれています)。

    COL OWNER FORMAT a10;
    COL NAME FORMAT a25;
    COL STATUS FORMAT a10;
    
    SELECT OWNER, SEGMENT_NAME NAME,
           POPULATE_STATUS STATUS
    FROM   V$IM_SEGMENTS
    WHERE  SEGMENT_NAME = 'CUSTOMERS';
    
    no rows selected

    上の出力では、オブジェクトがまだIM列ストアに移入されていないことが示されています。

  4. 表に対してDBMS_INMEMORY.POPULATEプロシージャを実行します。

    たとえば、次のようにこのプロシージャをsh.customersに対して有効にします。

    EXEC DBMS_INMEMORY.POPULATE('SH', 'CUSTOMERS');
  5. 必要な場合は、移入ステータスを確認するために、V$IM_SEGMENTSを問い合せます。

    たとえば、次の文を使用します(出力例が含まれています)。

    SELECT OWNER, SEGMENT_NAME NAME,
           POPULATE_STATUS STATUS
    FROM   V$IM_SEGMENTS
    WHERE  SEGMENT_NAME = 'CUSTOMERS';
    
    OWN NAME       STATUS
    --- ---------- --------------------
    SH  CUSTOMERS  COMPLETED
    

    これで、オブジェクトがIM列ストアに移入されました。

関連項目:

4.7 IM列ストアに対するADOの有効化

情報ライフサイクル管理(ILM)は、作成からアーカイブまたは削除までデータを管理するための一連のプロセスおよびポリシーです。

自動データ最適化(ADO)では、ILM計画を実装するために、ポリシーが作成され、それらのポリシーに基づいてアクションが自動化されます。ADOでは、データ・アクセス・パターンを追跡する、ヒート・マップが使用されます。

ノート:

この章は、ILM、ADOおよびヒート・マップの基本概念をよく理解していることが前提となっています。より詳細な背景については、Oracle Database VLDBおよびパーティショニング・ガイドを参照してください。

この項では、次の項目について説明します。

4.7.1 ADOポリシーとIM列ストアについて

ADOでは、IM列ストアの管理にADOポリシーを使用します。セグメント・レベルでINMEMORY句を使用することによってのみ、ADOポリシーを作成できます。

データベースでは、ADOポリシーは、オブジェクトの属性のように扱われます。ADOポリシーは、インスタンス・レベルではなくデータベース・レベルとなります。Oracle Databaseでは、Database In-Memoryのために次のタイプのADOポリシーがサポートされています。

  • INMEMORYポリシー

    このポリシーは、オブジェクトをINMEMORY属性でマークし、それらをIM列ストアへの移入のために有効にします。

  • 再圧縮ポリシー

    このポリシーは、INMEMORYオブジェクトに対する圧縮レベルを変更します。

  • NO INMEMORYポリシー

    このポリシーは、オブジェクトをIM列ストアから削除し、そのINMEMORY属性を削除します。

Oracle Databaseでは、次の条件をサポートして、ポリシーを適用する時期を決定します。

  • オブジェクトが変更されてからの指定日数

    DBA_HEAT_MAP_SEGMENTビュー内の列SEGMENT_WRITE_TIMEからこの値を取得します。

  • オブジェクトがアクセスされてからの指定日数

    この値は、DBA_HEAT_MAP_SEGMENTビューの列SEGMENT_WRITE_TIMEFULL_SCANおよびLOOKUP_SCAN内の大きいほうの値となります。

  • オブジェクトが作成されてからの指定日数

    DBA_OBJECTS内のCREATED列からこの値を取得します。

  • ブール値を返すユーザー定義関数

関連項目:

4.7.2 ADOとIM列ストアの目的

ADOでは、IM列ストアが新しいデータ層として管理されます。

ポリシーを作成して、IM列ストアからオブジェクトがあまり頻繁にアクセスされない場合にはそのオブジェクトを除去し、オブジェクトが頻繁にアクセスされる場合にはそのオブジェクトを移入することで、問合せのパフォーマンスを向上することができます。ADOでは、ヒート・マップ統計を使用してIM列ストアが管理されます。

INMEMORYポリシーの目的

多くのデータベースでは、セグメントは、作成後に大幅に変更されます。パフォーマンスを最大限に高めるには、ADOで、書込みアクティビティがおさまったときに、これらのセグメントをIM列ストアに移入します。たとえば、パーティションを表に毎日追加する場合は、作成翌日にsales_2016_d100パーティションを移入するポリシーを作成できます。

ALTER TABLE sales MODIFY PARTITION sales_2016_d100 
  ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY 
    PRIORITY HIGH
  AFTER 1 DAYS OF CREATION

同様に、作成の2か月後に表に対する書込みアクティビティがおさまることが判明しており、この時間条件が満たされたときにこのオブジェクトを移入する必要があるとします。

ALTER TABLE 2016_ski_sales
  ILM ADD POLICY SET INMEMORY MEMCOMPRESS FOR QUERY 
    PRIORITY CRITICAL
  AFTER 60 DAYS OF CREATION

前述のポリシーでは、2016_ski_sales表のすべての既存および新規パーティションにポリシーを継承させます。セグメントがポリシーの対象となると、データベースにより、すべてのパーティションが、指定されたINMEMORY句で個別にマークされます。セグメントにすでにINMEMORYポリシーがある場合、データベースでは新しいポリシーは無視されます。

再圧縮ポリシーの目的

アクセス・パターンに基づいてIM列ストア内のデータを圧縮する必要がある場合があります。たとえば、セグメントに対するDMLアクティビティが終了した2日後に、セグメントをDML圧縮から問合せ圧縮に変更する必要があるとします。

ALTER TABLE lineorders 
  ILM ADD POLICY MODIFY INMEMORY MEMCOMPRESS FOR QUERY HIGH 
  AFTER 2 DAYS OF NO MODIFICATION

オブジェクトがIM列ストアに移入されていない場合、このポリシーでは、圧縮属性のみが変更されます。オブジェクトがIM列ストアに移入されている場合は、ADOにより、新しい圧縮レベルを使用してオブジェクトが再移入されます。セグメントにまだINMEMORY属性がない場合、データベースでは、ポリシーは無視されます。

NO INMEMORYポリシーの目的

IM列ストア内の領域を最適化するために、NO INMEMORYポリシーを使用して非アクティブなセグメントを除去できます。このポリシーは、不定期の問合せによる非アクティブなセグメントの移入を防止するためにも役立ちます。たとえば、特定のsalesパーティションに関するレポートが年内に頻繁に実行されるが、通常は毎週ではない場合に、このパーティションを、アクセスがなくなってから1週間後に除去する必要があるとします。

ALTER TABLE sales MODIFY PARTITION sales_2015_q1
  ILM ADD POLICY NO INMEMORY AFTER 7 DAYS OF NO ACCESS;

1998年用のsales表に問い合せることがほとんどない場合に、アクセスがなくなった翌日に除去する必要があるとします。

ALTER TABLE sales_1998
  ILM ADD POLICY NO INMEMORY AFTER 1 DAYS OF NO ACCESS;

除去されたセグメントの問合せがブロックされることはありません。データベースでは、常に、従来のバッファ・キャッシュ・メカニズムを使用してデータにアクセスできます。

4.7.3 ADOはどのように列データと連携するか

ADOの視点からは、IM列ストアは別の記憶域層となります。

この項では、次の項目について説明します。

4.7.3.1 ヒート・マップはどのように機能するか

有効になっている場合は、ヒート・マップにより、自動的にデータ・アクセス・パターンが検出されます。ADOでは、ヒート・マップ・データを使用して、ユーザーが定義したポリシーがデータベース・レベルで実装されます。

ヒート・マップでは、自動的に、行レベルおよびセグメント・レベルで使用情報が追跡されます。行レベルでは、ヒート・マップにより、データ変更回数が追跡されてから、これらの回数がブロック・レベルに集計されます。セグメント・レベルでは、ヒート・マップにより、変更、表の全体スキャンおよび索引参照の回数が追跡されます。

IM列ストアが有効になっている場合は、ヒート・マップにより、列データに対するアクセス・パターンが追跡されます。たとえば、sales表がホットであるのに対し、locations表がコールドだとします。ADOアルゴリズムは、行ベースのデータに対してと同じ方法で列データに対して機能します。

データベースでは、定期的にヒート・マップ・データがデータ・ディクショナリに書き込まれます。データベースにより、ヒート・マップ・データがデータ・ディクショナリ・ビューで公開されます。たとえば、インメモリー・オブジェクトに対する読取り回数と書込み回数を取得するには、ALL_HEAT_MAP_SEGMENTビューを問い合せます。

関連項目:

4.7.3.2 ポリシー評価はどのように機能するか

IM列ストア・ポリシーのポリシー評価では、他のADOポリシーの評価と同じインフラストラクチャが使用されます。データベースでは、メンテナンス・ウィンドウの間に自動的にポリシーが評価および実行されます。

データベースでは、データ・ディクショナリに格納されているヒート・マップ統計を使用してポリシーが評価されます。INMEMORY属性の設定は、大部分はメタデータ操作となります。そのため、パフォーマンスへの影響は最小限となります。

ADOでは、ジョブ・スケジューラを使用して移入が実行されます。インメモリー・コーディネータ・プロセス(IMCO)により、移入が実行されます。

4.7.4 ADOとIM列ストアの制御

HEAT_MAP初期化パラメータを使用してヒート・マップを有効にします。SQLおよびPL/SQLインタフェースを使用してADOを制御します。

DDL文のILM句

インメモリー・ポリシーの作成には新しいSQL文は必要ありませんが、ILM句には新しいオプションがあります。次の表では、ADOとIM列ストアのためのSQLオプションを説明します。

表4-3 ADOとIM列ストアのためのILM句

説明
SET INMEMORY オブジェクトに対してINMEMORY属性を設定します。
ALTER TABLE sh.sales 
  ILM ADD POLICY 
  SET INMEMORY 
  MEMCOMPRESS FOR QUERY LOW
  PRIORITY HIGH 
  SEGMENT 
  AFTER 30 DAYS OF CREATION;
MODIFY INMEMORY オブジェクトに対する圧縮レベルを変更します。
ALTER TABLE sh.customers 
  ILM ADD POLICY 
  MODIFY INMEMORY 
  MEMCOMPRESS FOR QUERY HIGH
  PRIORITY CRITICAL 
  SEGMENT 
  AFTER 30 DAYS OF CREATION;
NO INMEMORY オブジェクトに対してNO INMEMORY属性を設定します。
ALTER TABLE sh.products 
  ILM ADD POLICY 
  NO INMEMORY 
  SEGMENT 
  AFTER 30 DAYS OF CREATION;

初期化パラメータ

次の表では、ADOとIM列ストアに関連する初期化パラメータを説明します。

表4-4 ADOとIM列ストアのための初期化パラメータ

初期化パラメータ 説明
COMPATIBLE 互換性を維持する必要があるデータベースのリリースを指定します。ADOでIM列ストアを管理する場合は、このパラメータを12.2.0以上に設定します。
HEAT_MAP ヒート・マップ機能とADO機能を両方とも有効にします。ADOでIM列ストアを管理する場合は、このパラメータをONに設定します。
INMEMORY_SIZE IM列ストアを有効にします。このパラメータは、ゼロ以外の値に設定する必要があります。

PL/SQLパッケージ

次の表では、ADOとIM列ストアに関連するPL/SQLパッケージを説明します。

表4-5 ADOとIM列ストアのためのPL/SQLパッケージ

パッケージ 説明
DBMS_HEATMAP 表領域、セグメント、オブジェクト、エクステントおよびブロック・レベルでの詳細なヒート・マップ・データを表示します。
DBMS_ILM ADOポリシーを使用してILM計画を実装します。
DBMS_ILM_ADMIN ADOポリシーの実行をカスタマイズします。

V$およびデータ・ディクショナリ・ビュー

次の表では、ADOとIM列ストアに関連するビューを説明します。

表4-6 ADOとIM列ストアのためのビュー

ビュー 説明
DBA_HEAT_MAP_SEG_HISTOGRAM ユーザーが参照できるすべてのセグメントのセグメント・アクセス情報を表示します。
DBA_HEAT_MAP_SEGMENT ユーザーが参照できるすべてのセグメントの最新のセグメント・アクセス時刻を表示します。
DBA_HEATMAP_TOP_OBJECTS デフォルトでは、オブジェクトの上位10000個についてヒート・マップ情報を示します。
DBA_HEATMAP_TOP_TABLESPACES 上位10000個の表領域についてヒート・マップ情報を示します。
DBA_ILMDATAMOVEMENTPOLICIES データベース内のADOポリシーのデータ移動関連属性固有の情報を表示します。action_type列では、IM列ストアに関連するポリシーを説明します。使用可能な値は、COMPRESSIONSTORAGEEVICTおよびANNOTATEです。
V$HEAT_MAP_SEGMENT リアルタイムのセグメント・アクセス情報を表示します。

関連項目:

初期化パラメータ、パッケージおよびビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照

4.7.5 IM列ストアのためのADOポリシーの作成

ADOポリシーを使用することで、ヒート・マップ統計に基づいた、オブジェクトに対するINMEMORY句の設定、変更または削除が可能です。

ADO IM列ストア・ポリシーを作成するには、ALTER TABLE文でILM ADD POLICY句を指定し、その後に、次のいずれかの副句を指定します。
  • SET INMEMORY ... SEGMENT

    このオプションは、DMLアクティビティがおさまっているときのみセグメントをINMEMORY属性でマークする必要がある場合に役立ちます。

  • MODIFY INMEMORY ... MEMCOMPRESS ... SEGMENT

    圧縮されていないデータまたはMEMCOMPRESS FOR DMLレベルでのデータの格納は、それが頻繁に変更されるときに適しています。別の圧縮レベルは、問合せに適しています。セグメントに対するアクティビティの大部分が書込みから読取りに推移した場合は、MODIFY句を使用して異なる圧縮方法を適用できます。

  • NO INMEMORY ... SEGMENT

    このオプションは、セグメントへのアクセスが時間とともに減少する(コールドになる)場合や、ランダム・アクセスの結果としてこのセグメントの移入を防ぐために役立ちます。

前提条件

ADO IM列ストア・ポリシーを使用する前に、次の前提条件を満たしている必要があります。

  • INMEMORY_SIZE初期化パラメータにゼロ以外の値を設定し、データベースを再起動することにより、データベースのIM列ストアを有効化します。

  • HEAT_MAP初期化パラメータをONに設定する必要があります。

    ヒート・マップは、セグメント・レベルのデータ・アクセス・トラッキングおよびセグメントおよび行レベルのデータ変更トラッキングを提供します。

  • COMPATIBLE初期化パラメータは12.2.0以上に設定されている必要があります。

ADOポリシーを作成するには:

  1. SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。

  2. ALTER TABLE文をILM ADD POLICY ... INMEMORY句とともに使用します。

例4-16 除去ポリシーの作成

この例では、3日間アクセスされなかったoe.order_items表がIM列ストアから除去されるよう指定するポリシーを作成します。ADO IM列ストア・ポリシーは、セグメント・レベルのポリシーである必要があります。

ALTER TABLE oe.order_items ILM ADD POLICY
   NO INMEMORY SEGMENT
   AFTER 3 DAYS OF NO ACCESS;

例4-17 DBMS_ILMの使用によるILMポリシーの実行

ポリシーを手動で評価および実行することもできます。したがって、オブジェクトを圧縮および階層化する必要がある時期をプログラムで決定できます。次の例では、sh.salesのためのADOタスクを手動で実行します。

DECLARE
  v_executonid NUMBER;
BEGIN
  DBMS_ILM.EXECUTE_ILM ( owner           => 'SH', 
                         object_name     => 'SALES',
                         execution_mode  => DBMS_ILM.ILM_EXECUTION_OFFLINE,
                         task_id         => v_executionid);
END;
/

関連項目: