4 インメモリー・オブジェクトの管理の自動化

自動インメモリーおよび自動データ最適化(ADO)は、ユーザーの介入なしにIM列ストアのオブジェクトを動的に管理します。

ノート:

自動インメモリーおよびADOは、現在、外部表およびハイブリッド・パーティション表をサポートしていません。

自動インメモリーの構成

INMEMORY_AUTOMATIC_LEVELHIGHの場合、すべてのオブジェクトがデフォルトでINMEMORYとして指定されます。自動インメモリーは、アクセス・トラッキングと列統計を使用して、IM列ストア内のオブジェクトを管理します。

ノート:

INMEMORY_FORCE初期化パラメータにBASE_LEVELが設定されている場合は、INMEMORY_AUTOMATIC_LEVELが設定されていても自動インメモリーは無効になります。表の圧縮レベルがAUTOの場合でも、自動インメモリー・バックグラウンド操作は実行されません。

自動インメモリーの目的

自動インメモリーは、手動での介入なしで、変更に応じてSQLワークロードを最適化します。

The 作業データ・セットは最も頻繁に問合せを実行するセグメントで構成されます。通常、作業データ・セットは多くのアプリケーションで時間とともに変化します。ユーザーは、INMEMORYとして有効にするセグメントを決定し、使用状況を監視し、データの追加と削除の対象とするIMセグメントを決定し、ADO IMポリシーを作成する必要があります。これらのタスクでは、ワークロードを完全に理解する必要があります。

手動保守作業からDBAを解放するために、自動インメモリーは、頻繁に更新される内部統計を使用してIM列ストア内の作業データ・セットを保守します。Oracle Databaseは、移入対象と除去対象、およびその実行時期を決定します。ある意味では、IM列ストアは「自動運転」になります。

自動インメモリーの仕組み

自動インメモリーでは、セグメント・レベルのアクセス・トラッキングと内部統計を使用して、インメモリー・オブジェクトおよび列へのアクセス頻度を決定します。

自動インメモリー・ヒート・レベル統計

自動インメモリーは、ヒート・マップに似た列統計インフラストラクチャに加えて、セグメント・レベルのアクセス・トラッキングを使用してセグメントを監視します。

次の図に示されているように、自動インメモリーは、ヒート・レベル統計を使用して、移入および除去するセグメントと圧縮する列を決定します。

図4-1 自動インメモリー

図4-1の説明が続きます
「図4-1 自動インメモリー」の説明

INMEMORY_AUTOMATIC_LEVELHIGHの場合、自動インメモリーはIMストアの列統計を連続して監視します。データベースは、内部の列統計を介して、IMストアのコールド領域を特定します。ヒート・マップで使用されるものに似ていますがHEAT_MAPONに設定する必要はありません。ヒートレベルの統計を使用して、自動インメモリーは、オブジェクトの移入や除去および列の圧縮によって記憶域を最適化します。

自動インメモリーのオブジェクトを有効にする仕組み

INMEMORY_AUTOMATIC_LEVELの設定に応じて、データベースまたはユーザーのいずれかがインメモリー・アクセス用の特定のオブジェクトを有効にします。

INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されている場合、既存のINMEMORY設定がないセグメントはすべて自動的にINMEMORY MEMCOMPRESS AUTOとマークされます。パーティション表の場合、Oracle Databaseは、既存のパーティションおよび新しいパーティションの圧縮レベルをMEMCOMPRESS AUTOに設定します。いずれの場合も、セグメントに既存のINMEMORY設定がある場合は、以前の設定が保持されます。

MEMCOMPRESS AUTO設定は、セグメントがインメモリー・アクセスに対して自動的に有効になり、DDLが不要であることを意味します。インメモリー表にはDMLのオーバーヘッドが伴うことに注意してください。中レベルまたは高レベルのDMLを使用する表に対してINMEMORYを有効化するHIGHレベルについて関心がある場合は、これらの表をNO INMEMORYとして手動で指定できます。INMEMORY MEMCOMPRESS AUTO句を指定することで、NO INMEMORY表を再び有効にできます。

INMEMORY_AUTOMATIC_LEVELHIGHではない場合、すべてのオブジェクトはデフォルトでNO INMEMORYになります。INMEMORY_AUTOMATIC_LEVELHIGHに設定し、後で別の値を設定すると、データベースは以前MEMCOMPRESS AUTOだったセグメントをすべてNO INMEMORYに変更します。この場合、DDLを実行して目的のセグメントをインメモリー・アクセスのために有効にする必要があります(自動インメモリーが有効になっていない場合に必要な操作と同じです)。

例4-1 自動インメモリーをHIGHに設定

この例では、IM列ストアは有効ですが、現在、ユーザー指定のINMEMORY設定を持つセグメントはなく、自動インメモリーは無効になっています。管理者としてsalespdbにログインし、次のようにします。

  1. データ・ディクショナリを問い合せて、INMEMORYとして指定されている表があるかどうかを判断します。

    SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION 
    FROM   DBA_TABLES 
    WHERE OWNER='SH' AND TABLE_NAME IN ('COUNTRIES', 'PRODUCTS', 'TIMES') 
    ORDER BY TABLE_NAME;
    
    TABLE_NAME                 PAR INMEMORY INMEMORY_COMPRESS
    -------------------------- --- -------- -----------------
    COUNTRIES                  NO  DISABLED
    PRODUCTS                   NO  DISABLED
    TIMES                      NO  DISABLED
  2. INMEMORY属性をcountries表に適用します。

    ALTER TABLE sh.countries INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;
  3. データ・ディクショナリを問い合せて、変更を確認します。

    SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION 
    FROM   DBA_TABLES 
    WHERE OWNER='SH' AND TABLE_NAME IN ('COUNTRIES', 'PRODUCTS', 'TIMES') 
    ORDER BY TABLE_NAME;
    
    TABLE_NAME                 PAR INMEMORY INMEMORY_COMPRESS
    -------------------------- --- -------- -----------------
    COUNTRIES                  NO  ENABLED  FOR CAPACITY HIGH
    PRODUCTS                   NO  DISABLED
    TIMES                      NO  DISABLED
  4. CDBルートに接続し、INMEMORY_AUTOMATIC_LEVELHIGHに設定します。

    ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = 'HIGH' SCOPE=SPFILE;
  5. CDBを停止して、再度開きます。

    SHUTDOWN IMMEDIATE
    STARTUP
  6. salespdbにログインして、データ・ディクショナリを問い合せて現在のINMEMORY圧縮設定を判断します。

    SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION 
    FROM   DBA_TABLES 
    WHERE OWNER='SH' AND TABLE_NAME IN ('COUNTRIES', 'PRODUCTS', 'TIMES') 
    ORDER BY TABLE_NAME;
    
    TABLE_NAME                 PAR INMEMORY INMEMORY_COMPRESS
    -------------------------- --- -------- -----------------
    COUNTRIES                  NO  ENABLED  FOR CAPACITY HIGH
    PRODUCTS                   NO  ENABLED  AUTO
    TIMES                      NO  ENABLED  AUTO

    INMEMORYとして手動で指定されたcountries表は、以前の設定を保持します。これで、他の表に圧縮レベルAUTOが設定されます。

  7. INMEMORY MEMCOMPRESS AUTO属性をcountries表に適用します。

    ALTER TABLE sh.countries INMEMORY MEMCOMPRESS AUTO;
  8. データ・ディクショナリを問い合せて、現在のINMEMORY圧縮設定を判断します。

    SELECT TABLE_NAME, PARTITIONED, INMEMORY, INMEMORY_COMPRESSION 
    FROM   DBA_TABLES 
    WHERE OWNER='SH' AND TABLE_NAME IN ('COUNTRIES', 'PRODUCTS', 'TIMES') 
    ORDER BY TABLE_NAME;
    
    TABLE_NAME                 PAR INMEMORY INMEMORY_COMPRESS
    -------------------------- --- -------- -----------------
    COUNTRIES                  NO  ENABLED  AUTO
    PRODUCTS                   NO  ENABLED  AUTO
    TIMES                      NO  ENABLED  AUTO

    これで、すべての表に圧縮レベルAUTOが表示されます。

自動インメモリー移入の仕組み

INMEMORY_AUTOMATIC_LEVELの設定に応じて、移入が、作業データ・セット内のオブジェクトに対して自動的に行われるか、ユーザー指定のINMEMORYの設定に依存します。

INMEMORY_AUTOMATIC_LEVELHIGHに設定されている場合、データベースは作業データ・セットに属していると判断したオブジェクトのみを移入します。この決定は、現在の使用統計に基づきます。たとえば、sales表の特定のパーティションが「ホット」である(頻繁に問合せされる)場合、自動インメモリーはこのパーティションを移入する場合があり、ホットであるかぎりIM列ストアに保持します。自動インメモリーは、より高い圧縮レベルでコールド列を移入するように決定する場合もあります。

INMEMORY_AUTOMATIC_LEVELMEDIUM設定は、HIGH設定と似ています。唯一の違いは、HIGH設定ではOracle Databaseがコールド列を圧縮することです。INMEMORY_AUTOMATIC_LEVELLOWの場合、データベースは、ユーザー指定のINMEMORYの設定に従ってオブジェクトを移入します。たとえば、オブジェクトをINMEMORY PRIORITY NONEに設定した場合、スキャンまたはPL/SQLコールを使用して、これらのオブジェクトの移入を手動で強制する必要があります。

自動インメモリーの削除の仕組み

データ除去の単位は、INMEMORYセグメントです。

作業データ・セットが常に移入されるように、自動インメモリーは自動的にコールド(アクセス頻度の低い)セグメントを除去します。メモリー不足は、INMEMORYデータ・セットのサイズがIM列ストアの使用可能メモリーを超過し、移入された一部のセグメントが非アクティブになったときに発生します。

コールド・セグメントを自動的に除去することで、自動インメモリーには次の利点があります。

  • パフォーマンスの向上

    自動インメモリーでは、作業データ・セットがIM列ストア内に存在しているという理由で、ワークロードのパフォーマンスが改善されます。

  • 管理が容易

    手動でのコールド・セグメントの除外は、かなりのユーザー介入を伴います。自動インメモリーがこのプロセスを自動化し、必要なユーザー介入を最小限に抑えます。

INMEMORY_AUTOMATIC_LEVELがHIGHの場合

INMEMORY_AUTOMATIC_LEVEL初期化パラメータがHIGHに設定されている場合、自動インメモリーは内部統計を使用して、セグメントの削除時期を決定します。また、自動インメモリーは、コールド列をMEMCOMPRESS AUTOセグメントに再圧縮して領域を節約できます。PRIORITY設定がNONE以外のセグメントは、自動削除アルゴリズムから除外されます。

INMEMORY_AUTOMATIC_LEVELがLOWまたはMEDIUMの場合

INMEMORY_AUTOMATIC_LEVELLOWまたはMEDIUMの場合、INMEMORYセグメントは優先度がNONEの場合のみ自動削除の対象になります。IM列ストアは、それが削除または移動された場合、INMEMORYオプションが削除された場合、またはIM ADOポリシーが適用された場合にのみ、移入されたセグメントを削除します。基本的なプロセスは次のとおりです。

  1. 移入ジョブが失敗します。これは、IM列ストアの領域がすべて使用されたことを意味します。

  2. データベースは、対象となる移入されたセグメントの内部統計を使用して、除去するオブジェクトのセットを定義します。統計はヒート・マップで使用されるものと似ていますが、ヒート・マップを有効にする必要はありません。

  3. セット内の各セグメントについて、データベースはセグメントに対してADOポリシーが有効かどうかをチェックします。

    • 有効なポリシーでセグメントが移入されたままになっている必要がある場合、ADOポリシーは自動インメモリーをオーバーライドします。データベースは何も行いません。

    • どのポリシーも除去を妨げていない場合、自動インメモリーはセグメントを除去するタスクを送信します。

  4. データベースは、前述のチェックを通過するセグメントをすべて除去し、IM列ストア内の領域を解放します。

    INMEMORY属性は、除去されたセグメントに保持されます。

たとえば、夜間のバッチ・ジョブがsalesパーティション(優先度NONE)をロードした後、移入をトリガーするパーティションに問い合せます。IM列ストアはほぼ最大容量になっているため、パーティションの行の半分のみが移入されます。新しいパーティションを完全に移入できないと、自動インメモリーがトリガーされ、コールド・セグメントが除去されます。新しいパーティションに対する後続のオンデマンド移入ジョブによって、新しいsalesパーティションが完全に移入されます。

自動インメモリーのユーザー・インタフェース

初期化パラメータINMEMORY_AUTOMATIC_LEVELを使用して、自動インメモリーを有効または無効にします。

初期化パラメータ

システム・レベルの初期化パラメータINMEMORY_AUTOMATIC_LEVELは、次の値を指定できます。

  • OFF (デフォルト)

    このオプションは、自動インメモリーを無効にし、IM列ストアをOracle Database 12cリリース2 (12.2.0.1)の動作に戻します。

  • LOW

    メモリー不足の場合、データベースはIM列ストアからコールド・セグメントを除去します。

  • MEDIUM

    このレベルには、メモリー不足のために移入されなかったホット・セグメントが最初に投入されることを保証する追加の最適化が含まれます。

  • HIGH

    INMEMORY_AUTOMATIC_LEVELHIGHに設定すると、トランザクション・スループットの低下を伴うすべての参照ワークロードの問合せパフォーマンスが向上します。このレベルの自動インメモリーでは、デフォルトですべてのユーザー・セグメントをINMEMORY COMPRESS AUTOとしてマークします。以前ユーザーによってINMEMORYとマークされたセグメントは、すべて属性を保持します。

    HIGH設定により、NO INMEMORYで明示的に注釈が付けられたシステム作成オブジェクトおよびセグメント以外のすべてのデータベース・オブジェクトがインメモリー列ストアへの移入候補となります。INMEMORY_AUTOMATIC_LEVEL=HIGHを設定すると、これらのオブジェクトは、インメモリーのマーク付けを含むあらゆる自動インメモリー・アクションから除外されます。

    HIGHから別の値に変更すると、INMEMORY COMPRESS AUTOに設定されたセグメントはNO INMEMORYに変更されます。

ノート:

自動インメモリーでは、HEAT_MAP初期化パラメータを有効にする必要はありません。

関連項目:

INMEMORY_AUTOMATIC_LEVELについてさらに学習するには、Oracle Databaseリファレンスを参照

追加の共有プール・メモリー要件

IM列ストアに収まるように作業データ・セットに十分なメモリーをプロビジョニングすることをお薦めします。追加の自動インメモリー共有プール要件のサイズを設定するための経験則として、SGAメモリーのINMEMORYセグメントの数に5KBを掛けます。たとえば、10,000個のセグメントにINMEMORY属性がある場合は、自動インメモリー用に50MBの共有プールを確保します。

DBMS_AUTOIM

DBMS_AUTOIMパッケージは、AIM機能およびレポート機能の実行を管理するAPIを提供します。

DBMS_AUTOIMパッケージを使用して、自動インメモリーが統計を考慮する期間枠を制御します。たとえば、自動インメモリーが過去1か月または過去1週間のみを考慮するように指定できます。

AIM_STATWINDOW_DAYSのデフォルト値は1日です。

ACTIVITY_REPORT関数を使用して、IMパフォーマンス機能の自動作成に関するレポートを生成します。これらの機能には、Autonomous Join Groups、Autonomous Bloom Filter Optimization、Autonomous Optimized ArithmeticおよびAutonomous Vector Optimizationがあります。

DBMS_AUTOIMと連携するデータ・ディクショナリ・ビュー

DBA_INMEMORY_AIMTASKSビューは、自動インメモリーのタスクによる決定を追跡できます。たとえば、次の問合せはタスクを作成日順に表示します。

SELECT TASK_ID, TO_CHAR(CREATION_TIME,'DD-MON-YY hh24:mi:ss') AS CREATE_TIME, STATE 
FROM DBA_INMEMORY_AIMTASKS
ORDER BY CREATE_TIME;

   TASK_ID CREATE_TIME                 STATE
---------- --------------------------- ----------
         1 11-JUN-19 12:11:09          DONE
         2 11-JUN-19 12:15:12          DONE
         3 11-JUN-19 12:17:12          DONE
         4 11-JUN-19 12:19:12          DONE
         5 11-JUN-19 12:21:14          DONE
...

DBA_INMEMORY_AIMTASKDETAILSビューには、タスクに関連する詳細が記述されています。たとえば、次の問合せはスキーマshのタスク1のアクションと状態を示します。

COL TASK_ID FORMAT a99999
COL OBJECT_OWNER FORMAT a7
COL OBJECT_NAME FORMAT a19
COL SUBOBJECT_NAME FORMAT a13
COL ACTION FORMAT a13
COL STATE FORMAT a10

SELECT * FROM DBA_INMEMORY_AIMTASKDETAILS
WHERE  OBJECT_OWNER = 'SH' and TASK_ID = 1;

   TASK_ID OBJECT_ OBJECT_NAME        SUBOBJECT_NAM ACTION        STATE
---------- ------- ------------------ ------------- ------------- –--------
         1 SH      CAL_MONTH_SALES_MV               EVICT         DONE
         1 SH      CHANNELS                         EVICT         DONE
         1 SH      COSTS              COSTS_Q1_1998 POPULATE      SCHEDULED
         1 SH      COSTS              COSTS_Q1_1999 POPULATE      SCHEDULED
...

関連項目:

DBA_INMEMORY_AIMTASKSおよびDBA_INMEMORY_AIMTASKDETAILSについてさらに学習するには、『Oracle Databaseリファレンス』を参照してください。

このデータベース・リファレンスでは、DBMS_AIM_ADMINに関連する次の追加のビューについて説明しています。
  • V_AUTO_IM_FEATURESは、AIMによって最適化された様々なIMパフォーマンス機能を識別します。
  • DBA_AIM_PERF_FEATURESは、AIMパフォーマンス機能が有効になっている表の列を示します。
  • DBA_JOINGROUPSは、ユーザーに属する結合グループの表にAUTO_CREATEDおよびCREATION_DATE 列を含めるように更新されました。結合グループの自動作成はAIM機能であり、特定の問合せでは、データベースで列値を解凍およびハッシュするパフォーマンス上のオーバーヘッドを排除できます。

自動インメモリーの制御

INMEMORY_AUTOMATIC_LEVEL初期化パラメータを使用して、自動インメモリーを制御します。

デフォルトでは、自動インメモリーOFFに設定されています。INMEMORY_AUTOMATIC_LEVELMEDIUMLOWまたはHIGHに設定して、有効にします。

前提条件

このパラメータをALTER SYSTEMで設定するには、ALTER SYSTEM権限を持っている必要があります。

INMEMORY_AUTOMATIC_LEVEL設定を変更するには、次のようにします。

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

  2. INMEMORY_AUTOMATIC_LEVELの現在の設定を表示する場合:

    SQL> SHOW PARAMETER inmemory_automatic_level
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- -----
    inmemory_automatic_level             string      OFF
  3. ALTER SYSTEM文を使用してINMEMORY_AUTOMATIC_LEVELを指定します。

    次の例は、自動インメモリーを完全自動レベルに設定します。

    ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = 'HIGH' SCOPE=SPFILE;
  4. データベースを停止してから、SPFILEを使用して再度開きます。

関連項目:

INMEMORY_AUTOMATIC_LEVELについてさらに学習するには、Oracle Databaseリファレンスを参照

自動インメモリーの時間間隔の設定

DBMS_INMEMORY_ADMINパッケージを使用して、使用状況統計が自動インメモリーによってチェックされる時間間隔を設定します。

デフォルトでは、自動インメモリーは過去24時間の使用状況統計をチェックします。DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERAIM_STATWINDOW_DAYSパラメータを指定して、現在の設定を変更できます。

前提条件

DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERおよびDBMS_INMEMORY_ADMIN.AIM_GET_PARAMETERプロシージャを実行するには、管理者権限が必要です。

前提

間隔を7日間に設定するとします。

自動インメモリー間隔の設定を変更するには、次のようにします。

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

  2. 必要に応じて、aim_statwindow_daysパラメータの現在の設定を確認します。

    次の例では、DBMS_INMEMORY_ADMIN.AIM_GET_PARAMETERプロシージャをコールします。

    VARIABLE b_interval NUMBER
    
    BEGIN
      DBMS_INMEMORY_ADMIN.AIM_GET_PARAMETER(
        DBMS_INMEMORY_ADMIN.AIM_STATWINDOW_DAYS, :b_interval);
    END;
    /
    
    PRINT b_interval
    
    B_INTERVAL
    -----------------------------
    1
  3. DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERプロシージャを使用してaim_statwindow_days設定を変更します。

    次のコードは、設定を7日間に変更します。

    BEGIN
      DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETER( 
        DBMS_INMEMORY_ADMIN.AIM_STATWINDOW_DAYS, 7);
    END;
    /

関連項目:

DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERおよびDBMS_INMEMORY_ADMIN.AIM_GET_PARAMETERプロシージャについてさらに学習するには、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照

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

自動データ最適化(ADO)では、ILM計画を実装するために、ポリシーが作成され、それらのポリシーに基づいてアクションが自動化されます。

ADOは、ブロックとセグメントのデータ・アクセス・パターンを追跡するヒート・マップを使用します。ADOおよびヒート・マップは、情報ライフサイクル管理(ILM)の一部であり、作成からアーカイブまたは削除までのデータを管理する一連のプロセスおよびポリシーです。この章は、ILM、ADOおよびヒート・マップをよく理解していることが前提となっています。

関連項目:

ILM、ADOおよびヒート・マップの概要は、Oracle Database VLDBおよびパーティショニング・ガイドを参照

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

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

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

  • INMEMORYポリシー

    このポリシーは、オブジェクトをINMEMORY属性でマークし、それらをIM列ストアへの移入のために有効にします。表レベルで設定された場合、INMEMORY属性はすべてのパーティションに適用されます(内部、外部を問わず)。

  • 再圧縮ポリシー

    このポリシーは、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列からこの値を取得します。

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

関連項目:

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;

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

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

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

ヒート・マップの仕組み

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

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

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

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

関連項目:

ポリシー評価の仕組み

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

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

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

ADOとIM列ストアの制御

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

DDL文のILM句

インメモリー・ポリシーの作成には新しいSQL文は必要ありませんが、ILM句には新しいオプションがあります。次の表では、ADOとIM列ストアのためのSQLオプションを説明します。自動インメモリーは、外部表とハイブリッド・パーティション表をサポートしないことに注意してください。

表4-1 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;

関連項目:

CREATE TABLEilm_policy_clauseについてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照

初期化パラメータ

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

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

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

PL/SQLパッケージ

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

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

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

関連項目:

DBMS_HEAT_MAPパッケージ、DBMS_ILMパッケージおよびDBMS_ILM_ADMINパッケージについてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照

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

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

表4-4 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リファレンス』を参照

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-2 除去ポリシーの作成

この例では、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-3 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;
/

関連項目:

AIMによるパフォーマンス機能の自動有効化および管理の許可

データ要件に基づいて、特定のインメモリー機能の有効化および管理のタイミングをデータベースに自動的に決定させることができます。

インメモリー機能を有効にすることでデータのメリットが得られるかどうかを判断するには、コストとメリットを理解するためにワークロードをかなり分析する必要があります。たとえば、結合グループは、適切に適用するとパフォーマンスが向上する可能性があります。以前のOracle Databaseリリースでは、まずワークロードを調査して、結合グループが有益である可能性がある場所を特定し、それらを作成し、パフォーマンスを監視して、利点がないかパフォーマンスの低下がある場合はそれらを削除していました。

自動インメモリーがHIGHに設定され、AIM_TASKDBMS_AUTOIM.SET_PARAMETER ('AIM_TASK', 'ENABLE')を介して有効になっている場合、データベースはこのすべてを結合グループ、インメモリー最適化算術およびベクトル最適化に対して自動的に実行できるようになりました。また、自動チューニングでは、結合でBloomフィルタが使用されると、結合列のハッシュも自動的にキャッシュされます。また、この変更を監視し、コスト効率が低い場合は元に戻します。

DBMS_AUTOIM API

DBMS_AUTOIMは、一部のAIM設定を制御するためのPL/SQLインタフェースです。

DBMS_AUTOIMには、一部のAIM設定を制御するためのSET_PARAMETERプロシージャが用意されています。また、選択した機能に関するデータを収集するためのACTIVITY_REPORT関数も含まれています。

DBMS_AUTOIM.SET_PARAMETER

DBMS_AUTOIM.SET_PARAMETER( 
parameter_name    IN NUMBER,
parameter_value   IN NUMBER);
  • 自動IMパフォーマンス機能の作成を有効または無効にします。
    DBMS_AUTOIM.SET_PARAMETER('AIM_TASK', 'ENABLE');
    DBMS_AUTOIM.SET_PARAMETER('AIM_TASK', 'DISABLE');
    
  • 自動IMパフォーマンス機能の作成タスクの頻度を秒単位で設定します。デフォルトは900です。
    DBMS_AUTOIM.SET_PARAMETER('INTERVAL',900);

DBMS_AUTOIM.ACTIVITY_REPORT

DBMS_AUTOIM.ACTIVITY_REPORT(
     feature_id          IN number                   := NULL,
     start_time          IN timestamp with time zone := NULL,
     end_time            IN timestamp with time zone := NULL,
     type                IN varchar2                 := 'TEXT',
     level               IN varchar2                 := 'TYPICAL'
) return clob;

表4-5 DBMS_AUTOIM.ACTIVITY_REPORTのパラメータ

名前 説明
feature_id NULLの場合、すべてのAIM機能についてレポートが生成されます。デフォルトはNULLです。V$AUTO_IM_FEATURESを使用して、機能IDのリストを取得できます。
SQL> select * from v$auto_im_features;
start_time レポートの対象となるAIMアクティビティの開始時刻。NULLの場合、start_timeは最後に実行した開始時刻にデフォルト設定されます。デフォルトはNULLです。
end_time レポートの対象となるAIMアクティビティの終了時刻。NULLの場合、end_timeは最後に実行した終了時刻にデフォルト設定されます。デフォルトはNULLです。
type レポートのタイプ。設定可能な値: 'TEXT''HTML'および'XML'。デフォルトは'TEXT'です。
level レポートの詳細レベル。設定可能な値: 'BASIC'および'DETAILED'。デフォルトは'BASIC'です。

この例では、過去24時間のAutoIMアクティビティの典型的なレポートを作成します。

SQL>set long 2000000
SQL>set heading off
SQL>select dbms_autoim.activity_report() from dual;

関連項目:

DBMS_AUTOIMの詳細は、PL/SQLパッケージおよびタイプ・リファレンスを参照してください。

AIMを検査するためのビュー

2つのビューが、AIMのパフォーマンス機能に関する情報を提供します。

次のAIMビューがあります。

  • V$AUTO_IM_FEATURES

    AIMパフォーマンス機能が有効な表の列について説明します。

  • DBA_AIM_PERF_FEATURES

    AIMにより最適化されたインメモリー列ストアのパフォーマンス機能について説明します。

関連項目:

これらのビューの詳細は、上に示したOracle Databaseリファレンスへのリンクを参照してください。