4 インメモリー・オブジェクトの管理の自動化
自動インメモリーおよび自動データ最適化(ADO)は、ユーザーの介入なしにIM列ストアのオブジェクトを動的に管理します。
ノート:
自動インメモリーおよびADOは、現在、外部表およびハイブリッド・パーティション表をサポートしていません。
自動インメモリーの構成
INMEMORY_AUTOMATIC_LEVEL
がHIGH
の場合、すべてのオブジェクトがデフォルトでINMEMORY
として指定されます。自動インメモリーは、アクセス・トラッキングと列統計を使用して、IM列ストア内のオブジェクトを管理します。
ノート:
INMEMORY_FORCE
初期化パラメータにBASE_LEVEL
が設定されている場合は、INMEMORY_AUTOMATIC_LEVEL
が設定されていても自動インメモリーは無効になります。表の圧縮レベルがAUTO
の場合でも、自動インメモリー・バックグラウンド操作は実行されません。
自動インメモリーの目的
自動インメモリーは、手動での介入なしで、変更に応じてSQLワークロードを最適化します。
The 作業データ・セットは最も頻繁に問合せを実行するセグメントで構成されます。通常、作業データ・セットは多くのアプリケーションで時間とともに変化します。ユーザーは、INMEMORY
として有効にするセグメントを決定し、使用状況を監視し、データの追加と削除の対象とするIMセグメントを決定し、ADO IMポリシーを作成する必要があります。これらのタスクでは、ワークロードを完全に理解する必要があります。
手動保守作業からDBAを解放するために、自動インメモリーは、頻繁に更新される内部統計を使用してIM列ストア内の作業データ・セットを保守します。Oracle Databaseは、移入対象と除去対象、およびその実行時期を決定します。ある意味では、IM列ストアは「自動運転」になります。
自動インメモリーの仕組み
自動インメモリーでは、セグメント・レベルのアクセス・トラッキングと内部統計を使用して、インメモリー・オブジェクトおよび列へのアクセス頻度を決定します。
自動インメモリー・ヒート・レベル統計
自動インメモリーは、ヒート・マップに似た列統計インフラストラクチャに加えて、セグメント・レベルのアクセス・トラッキングを使用してセグメントを監視します。
次の図に示されているように、自動インメモリーは、ヒート・レベル統計を使用して、移入および除去するセグメントと圧縮する列を決定します。
INMEMORY_AUTOMATIC_LEVEL
がHIGH
の場合、自動インメモリーはIMストアの列統計を連続して監視します。データベースは、内部の列統計を介して、IMストアのコールド領域を特定します。ヒート・マップで使用されるものに似ていますがHEAT_MAP
をON
に設定する必要はありません。ヒートレベルの統計を使用して、自動インメモリーは、オブジェクトの移入や除去および列の圧縮によって記憶域を最適化します。
自動インメモリーのオブジェクトを有効にする仕組み
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_LEVEL
がHIGH
ではない場合、すべてのオブジェクトはデフォルトでNO INMEMORY
になります。INMEMORY_AUTOMATIC_LEVEL
をHIGH
に設定し、後で別の値を設定すると、データベースは以前MEMCOMPRESS AUTO
だったセグメントをすべてNO INMEMORY
に変更します。この場合、DDLを実行して目的のセグメントをインメモリー・アクセスのために有効にする必要があります(自動インメモリーが有効になっていない場合に必要な操作と同じです)。
例4-1 自動インメモリーをHIGHに設定
この例では、IM列ストアは有効ですが、現在、ユーザー指定のINMEMORY
設定を持つセグメントはなく、自動インメモリーは無効になっています。管理者として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 DISABLED PRODUCTS NO DISABLED TIMES NO DISABLED
-
INMEMORY
属性をcountries
表に適用します。ALTER TABLE sh.countries INMEMORY MEMCOMPRESS FOR CAPACITY HIGH;
-
データ・ディクショナリを問い合せて、変更を確認します。
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
-
CDBルートに接続し、
INMEMORY_AUTOMATIC_LEVEL
をHIGH
に設定します。ALTER SYSTEM SET INMEMORY_AUTOMATIC_LEVEL = 'HIGH' SCOPE=SPFILE;
-
CDBを停止して、再度開きます。
SHUTDOWN IMMEDIATE STARTUP
-
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
が設定されます。 -
INMEMORY MEMCOMPRESS AUTO
属性をcountries
表に適用します。ALTER TABLE sh.countries INMEMORY MEMCOMPRESS AUTO;
-
データ・ディクショナリを問い合せて、現在の
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_LEVEL
がHIGH
に設定されている場合、データベースは作業データ・セットに属していると判断したオブジェクトのみを移入します。この決定は、現在の使用統計に基づきます。たとえば、sales
表の特定のパーティションが「ホット」である(頻繁に問合せされる)場合、自動インメモリーはこのパーティションを移入する場合があり、ホットであるかぎりIM列ストアに保持します。自動インメモリーは、より高い圧縮レベルでコールド列を移入するように決定する場合もあります。
INMEMORY_AUTOMATIC_LEVEL
のMEDIUM
設定は、HIGH
設定と似ています。唯一の違いは、HIGH
設定ではOracle Databaseがコールド列を圧縮することです。INMEMORY_AUTOMATIC_LEVEL
がLOW
の場合、データベースは、ユーザー指定の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_LEVEL
がLOW
またはMEDIUM
の場合、INMEMORY
セグメントは優先度がNONE
の場合のみ自動削除の対象になります。IM列ストアは、それが削除または移動された場合、INMEMORY
オプションが削除された場合、またはIM ADOポリシーが適用された場合にのみ、移入されたセグメントを削除します。基本的なプロセスは次のとおりです。
-
移入ジョブが失敗します。これは、IM列ストアの領域がすべて使用されたことを意味します。
-
データベースは、対象となる移入されたセグメントの内部統計を使用して、除去するオブジェクトのセットを定義します。統計はヒート・マップで使用されるものと似ていますが、ヒート・マップを有効にする必要はありません。
-
セット内の各セグメントについて、データベースはセグメントに対してADOポリシーが有効かどうかをチェックします。
-
有効なポリシーでセグメントが移入されたままになっている必要がある場合、ADOポリシーは自動インメモリーをオーバーライドします。データベースは何も行いません。
-
どのポリシーも除去を妨げていない場合、自動インメモリーはセグメントを除去するタスクを送信します。
-
-
データベースは、前述のチェックを通過するセグメントをすべて除去し、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_LEVEL
をHIGH
に設定すると、トランザクション・スループットの低下を伴うすべての参照ワークロードの問合せパフォーマンスが向上します。このレベルの自動インメモリーでは、デフォルトですべてのユーザー・セグメントを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リファレンス』を参照してください。
- V_AUTO_IM_FEATURESは、AIMによって最適化された様々なIMパフォーマンス機能を識別します。
- DBA_AIM_PERF_FEATURESは、AIMパフォーマンス機能が有効になっている表の列を示します。
- DBA_JOINGROUPSは、ユーザーに属する結合グループの表に
AUTO_CREATED
およびCREATION_DATE
列を含めるように更新されました。結合グループの自動作成はAIM機能であり、特定の問合せでは、データベースで列値を解凍およびハッシュするパフォーマンス上のオーバーヘッドを排除できます。
自動インメモリーの制御
INMEMORY_AUTOMATIC_LEVEL
初期化パラメータを使用して、自動インメモリーを制御します。
デフォルトでは、自動インメモリーはOFF
に設定されています。INMEMORY_AUTOMATIC_LEVEL
をMEDIUM
、LOW
またはHIGH
に設定して、有効にします。
前提条件
このパラメータをALTER SYSTEM
で設定するには、ALTER SYSTEM
権限を持っている必要があります。
INMEMORY_AUTOMATIC_LEVEL
設定を変更するには、次のようにします。
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
INMEMORY_AUTOMATIC_LEVEL
の現在の設定を表示する場合:SQL> SHOW PARAMETER inmemory_automatic_level NAME TYPE VALUE ------------------------------------ ----------- ----- inmemory_automatic_level string OFF
-
ALTER SYSTEM
文を使用してINMEMORY_AUTOMATIC_LEVEL
を指定します。次の例は、自動インメモリーを完全自動レベルに設定します。
ALTER SYSTEM SET
INMEMORY_AUTOMATIC_LEVEL
= 'HIGH' SCOPE=SPFILE; -
データベースを停止してから、SPFILEを使用して再度開きます。
関連項目:
INMEMORY_AUTOMATIC_LEVEL
についてさらに学習するには、Oracle Databaseリファレンスを参照
自動インメモリーの時間間隔の設定
DBMS_INMEMORY_ADMIN
パッケージを使用して、使用状況統計が自動インメモリーによってチェックされる時間間隔を設定します。
デフォルトでは、自動インメモリーは過去24時間の使用状況統計をチェックします。DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETER
にAIM_STATWINDOW_DAYS
パラメータを指定して、現在の設定を変更できます。
前提条件
DBMS_INMEMORY_ADMIN.AIM_SET_PARAMETER
およびDBMS_INMEMORY_ADMIN.AIM_GET_PARAMETER
プロシージャを実行するには、管理者権限が必要です。
前提
間隔を7日間に設定するとします。
自動インメモリー間隔の設定を変更するには、次のようにします。
-
SQL*PlusまたはSQL Developerで、管理者権限を持つユーザーとしてデータベースにログインします。
-
必要に応じて、
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
-
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_TIME
、FULL_SCAN
およびLOOKUP_SCAN
内の大きいほうの値となります。 -
オブジェクトが作成されてからの指定日数
DBA_OBJECTS
内のCREATED
列からこの値を取得します。 -
ブール値を返すユーザー定義関数
関連項目:
-
DBA_HEAT_MAP_SEGMENT
ビューについて学習するには、『Oracle Databaseリファレンス』を参照 -
INMEMORY
句について学習するには、『Oracle Database SQL言語リファレンス』を参照
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
ビューを問い合せます。
関連項目:
-
ヒート・マップについてさらに学習するには、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照
-
ALL_HEAT_MAP_SEGMENT
ビューについて学習するには、『Oracle Databaseリファレンス』を参照
ポリシー評価の仕組み
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 属性を設定します。
|
|
MODIFY INMEMORY |
オブジェクトに対する圧縮レベルを変更します。 |
|
NO INMEMORY |
オブジェクトに対してNO INMEMORY 属性を設定します。
|
|
関連項目:
CREATE TABLE
のilm_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列ストアに関連するポリシーを説明します。使用可能な値は、COMPRESSION 、STORAGE 、EVICT およびANNOTATE です。
|
V$HEAT_MAP_SEGMENT |
リアルタイムのセグメント・アクセス情報を表示します。 |
関連項目:
ビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照
IM列ストアのためのADOポリシーの作成
ADOポリシーを使用することで、ヒート・マップ統計に基づいた、オブジェクトに対するINMEMORY
句の設定、変更または削除が可能です。
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ポリシーを作成するには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
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;
/
関連項目:
-
CREATE TABLE
の構文およびセマンティクスについては、『Oracle Database SQL言語リファレンス』を参照 -
DBMS_ILM
パッケージについてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
AIMによるパフォーマンス機能の自動有効化および管理の許可
データ要件に基づいて、特定のインメモリー機能の有効化および管理のタイミングをデータベースに自動的に決定させることができます。
インメモリー機能を有効にすることでデータのメリットが得られるかどうかを判断するには、コストとメリットを理解するためにワークロードをかなり分析する必要があります。たとえば、結合グループは、適切に適用するとパフォーマンスが向上する可能性があります。以前のOracle Databaseリリースでは、まずワークロードを調査して、結合グループが有益である可能性がある場所を特定し、それらを作成し、パフォーマンスを監視して、利点がないかパフォーマンスの低下がある場合はそれらを削除していました。
自動インメモリーがHIGH
に設定され、AIM_TASK
がDBMS_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のリストを取得できます。
|
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リファレンスへのリンクを参照してください。