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

自動データ最適化(ADO)および自動インメモリーを使用してIM列ストア内のオブジェクトを動的に管理できます。

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

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

関連項目:

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

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

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

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

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

ADOは、ADOポリシーを使用してIM列ストアを管理します。セグメント・レベルで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列からこの値を取得します。

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

関連項目:

5.1.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;

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

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

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

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

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

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

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

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

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

関連項目:

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

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

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

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

5.1.4 ADOとIM列ストアの制御

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

DDL文のILM句

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

表5-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;

初期化パラメータ

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

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

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

PL/SQLパッケージ

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

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

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

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

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

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

5.1.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句とともに使用します。

例5-1 除去ポリシーの作成

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

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

例5-2 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;
/

関連項目:

5.2 自動インメモリーの構成

自動インメモリーは、アクセス・トラッキング、列統計、およびその他の関連統計を使用して、IM列ストア内のオブジェクトを管理します。

IM列ストアがいっぱいで、より頻繁にアクセスされる他のセグメントがIM列ストア内の移入による利益を得られる場合、IM列ストアは非アクティブなセグメントを除去します。ただし、IM列ストアがすべてのINMEMORYセグメントを保持するように構成されている場合、自動インメモリーは何も行いません。

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

5.2.1 自動インメモリーの目的

作業データ・セットが常に移入されるように、自動インメモリーは自動的にコールド(アクセス頻度の低い)セグメントを除去します。

IM列ストアは、それが削除または移動された場合、INMEMORYオプションが削除された場合、またはIM ADOポリシーが適用された場合にのみ、移入されたセグメントを削除します。メモリー不足は、INMEMORYデータ・セットのサイズがIM列ストアの使用可能メモリーを超過し、移入された一部のセグメントが非アクティブになったときに発生します。最適パフォーマンスを得るために、IM列ストアは、最も頻繁に問合せされるセグメント(作業データ・セットとも呼ばれます)を含む必要があります。

通常、作業データ・セットは多くのアプリケーションで時間とともに変化します。したがって、最適化には、定期的な監視とDBAによる手動介入が必要です。これにより、IMストア要素を除去したり、ADO IMポリシーを作成できます。どちらのタスクでもワークロードをよく理解する必要があります。

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

  • パフォーマンスの向上

    コールド・セグメントの除去によりメモリー不足を緩和することで、自動インメモリーでは作業データ・セットがIM列ストア内に存在しているという理由でワークロードのパフォーマンスが向上します。

  • 管理が容易

    コールド・セグメントの除去によりメモリー不足を緩和するためのIM列ストアの管理には、かなりのユーザー介入が必要です。自動インメモリーが、ユーザーの介入を最小限に抑えてこれらの問題に対処します。

5.2.2 自動インメモリーはどのように機能するか

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

INMEMORYセグメントは、優先度がNONEの場合にのみ除去の対象となります。基本的なプロセスは次のとおりです。

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

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

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

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

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

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

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

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

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

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

初期化パラメータ

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

  • OFF (デフォルト)

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

  • LOW

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

  • MEDIUM

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

ノート:

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

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

関連項目:

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

DBMS_INMEMORY_ADMIN

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

DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETERプロシージャを使用して、AIM_STATWINDOW_DAYS定数を設定します。たとえば、スライディング統計ウィンドウを7日間に設定するには、次のプログラムを実行します。

EXEC DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETER ( DBMS_INMEMORY_ADMIN.AIM_STATWINDOW_DAYS, 7 );

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

対応するDBMS_INMEMORY_ADMIN.AIM_GET_PARAMETERプロシージャは、AIM_STATWINDOW_DAYSの現在の設定を取得します。

関連項目:

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

V$ VIEWS

V$IM_ADOTASKSおよびDBA_INMEMORY_AIMTASKSビューは、自動インメモリー・タスクによる決定を追跡できます。V$IM_ADOTASKDETAILSおよびDBA_INMEMORY_AIMTASKDETAILSビューには、タスクに関連する詳細が記述されています。

関連項目:

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

5.2.4 自動インメモリーの制御

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

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

前提条件

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

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

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

  2. ALTER SYSTEM文を使用してINMEMORY_AUTOMATIC_LEVELを指定します。

    次の例では、自動インメモリーを無効にします。

    ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = 'OFF' SCOPE=BOTH;

関連項目:

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

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

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

デフォルトでは、自動インメモリーは過去31日間の使用状況統計をチェックします。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
    -----------------------------
    31
  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パッケージおよびタイプ・リファレンスを参照