7 インメモリー式による問合せの最適化
IM列ストアとの関連においては、式は、1つ以上の値、演算子、および値を解決するSQLまたはPL/SQL関数(DETERMINISTIC
のみ)の組合せです。
式統計ストア(ESS)では、頻繁に評価される(ホットな)式の結果が自動的に追跡されます。DBMS_INMEMORY_ADMIN
パッケージを使用して、ホットな式を取得し、それらを非表示の仮想列として移入するか、それらの一部またはすべてを削除できます。
7.1 IM式について
デフォルトでは、DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
プロシージャは、インメモリー式(IM式)と呼ばれる、ホットな式を特定および移入します。
IM式は、ヒープ構成表における非表示の仮想列としてマテリアライズされますが、非仮想列と同じ方法でアクセスされます。マテリアライズされた式を格納するために、IM列ストアでは、固定幅ベクター、および固定幅コードでのディクショナリ・エンコーディングなど、特別な圧縮形式が使用されます。
ノート:
IM式は外部表ではサポートされていません。
Oracle Databaseにより、IM列ストアへの移入の候補となる式が自動的に特定されます。DBA_IM_EXPRESSIONS.COLUMN_NAME
では、IM式の列には接頭辞SYS_IME
があります。SYS_IME
列を直接作成することはできません。たとえば、weekly_sal
およびann_comp
という別名が付けられた2つの式を指定する、次のような問合せを考察します。
SELECT employee_id, last_name, salary, commission_pct,
ROUND(salary*12/52,2) as "weekly_sal",
12*(salary*NVL(commission_pct,0)+salary) as "ann_comp"
FROM employees
ORDER BY ann_comp;
ROUND(salary*12/52,2)
および12*(salary*NVL(commission_pct,0)+salary)
の計算式は、計算が集中的に行われて頻繁にアクセスされ、それにより、それらは非表示のIM式列の候補になります。
DBMS_INMEMORY_ADMIN
パッケージは、IM式を管理するための主要インタフェースです。
-
次回の再移入中にデータベースでIM式を特定してそれらがそれぞれの表に追加されるようにするには、
IME_CAPTURE_EXPRESSIONS
を使用します。 -
IM式の即時移入を強制的に実行するには、
IME_POPULATE_EXPRESSIONS
を使用します。 -
SYS_IME
列を削除するには、DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
またはDBMS_INMEMORY.IME_DROP_EXPRESSIONS
を使用します。
関連項目:
-
式についてさらに学習するには、『Oracle Database SQL言語リファレンス』を参照
-
DBMS_INMEMORY_ADMIN
についてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照 -
DBA_IM_EXPRESSIONS
ビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照
7.1.1 IM式の目的
IM式により、計算が集中的に行われる式を事前計算することで、データ・セットが大きい問合せが高速化されます。
IM式は、頻繁に実行される表結合、投影および述語評価に特に役立ちます。IM式の主な利点は、次のとおりです。
-
問合せで、式を毎回再計算する必要がありません。IM列ストアが式結果を移入しないと、データベースでは行ごとに計算が必要になり、これはリソースが集中的に消費されます。データベースで、移入中にCPUのオーバーヘッドが発生します。
-
IM式のマテリアライズによって、SIMDベクター処理やIMCUプルーニングなどのパフォーマンス強化機能をデータベースで利用できるようになります。
-
ユーザーではなく、データベースが、ユーザー指定の式取得ウィンドウ内で最もアクティブな式を追跡します。
IM式とマテリアライズド・ビューは、式の評価の繰返しをどのように回避するかという同じ問題に対応しています。ただし、IM式にはマテリアライズド・ビューを上回る利点があります。
-
IM式では、永続的に格納されるわけではないデータを取得できます。
たとえば、IM列ストアでは、問合せ内の式に基づいて、内部計算を自動的にキャッシュできます。
-
効率的に使用するために、マテリアライズド・ビューには問合せでリストされるすべての列が含まれるか、問合せがビューおよびベース表を結合する必要があります。対照的に、IM式が含まれる問合せはいずれも利点を享受できます。
-
ユーザーが作成したオブジェクトであるマテリアライズド・ビューとは異なり、データベースでは、IM式は自動的に特定および作成されます。
関連項目:
-
マテリアライズド・ビューについてさらに学習するには、『Oracle Databaseデータ・ウェアハウス・ガイド』を参照
7.1.2 IM式の仕組み
式をIM式の候補として特定するために、データベースでは、ESSに問い合せます。オプティマイザでは、ESSを使用して、ヒープ構成表に対する式評価についての統計が保持されます。
7.1.2.1 IM式のインフラストラクチャ
IM式のインフラストラクチャは、IM式の結果、IM仮想列、およびIM列ストア内のその他の役立つ内部計算を計算および移入する役割を担います。これらの最適化は、主に分析問合せに役立ちます。
移入された結果には、投影、スキャンまたは結合式で使用される列上の関数評価が含まれる可能性があります。IM列ストアでは、問合せ評価中に、SQLランタイム・エンジンによって評価される式に基づいて、内部計算を自動的にキャッシュできます。
仮想列
IM式の移入の他に、IM列ストアでは、インメモリー仮想列を移入できます。基礎となるメカニズムは同じです。IM式は仮想列です。ただし、IM仮想列がユーザーによって作成され公開されるのに対して、IM式はデータベースによって作成され非表示にされます。
関連項目:
静的式: バイナリJSON列
IM式のインフラストラクチャでは、動的式(IM式および仮想列)と静的式の両方がサポートされています。
Oracle Database 12cリリース2 (12.2)以降、IM列ストアでは、バイナリJSON形式のOSONがサポートされています。これは、行指向のJSONテキスト・ストレージよりもパフォーマンスに優れています。問合せでは、実際のJSONデータにアクセスしますが、アクセスの高速化のために、最適化された仮想列を使用します。
データベースでは、IM式のインフラストラクチャを使用して、JSONテキスト列の効率的なバイナリ表現が仮想列としてロードされます。MAX_STRING_SIZE
初期化パラメータが、VARCHAR2
データ型のEXTENDED
に設定されている場合は、IM列ストアに32KBまでのOSON仮想列を格納できます。
Oracle Databaseでは、JSON_TABLE
、JSON_VALUE
およびJSON_EXISTS
という複数のJSON関数がサポートされています。INMEMORY_EXPRESSIONS_USAGE
初期化パラメータは、動的式と静的式の両方の挙動を制御します。
関連項目:
-
Database In-MemoryでのJSONの使用についてさらに学習するには、Oracle Database JSON開発者ガイドを参照
-
INMEMORY_EXPRESSIONS_USAGE
、ALL_JSON_COLUMNS
およびMAX_STRING_SIZE
について学習するには、『Oracle Databaseリファレンス』を参照してください
7.1.2.2 IM式の取得
IME_CAPTURE_EXPRESSIONS
プロシージャを呼び出すと、データベースでESSに問合せが行われ、指定された時間範囲で最も頻繁にアクセスされている(最もホットな)式が20個特定されます。
時間範囲は、ユーザー定義の時間枠(過去24時間)またはデータベース作成以降のどちらかです。データベースでは、IM列ストアに少なくとも一部分が移入されている表の式のみが考慮されます。
7.1.2.2.1 式の取得間隔
式の取得間隔は、取得可能な式をデータベースが評価する期間です。
Oracle Database 18c以降、DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
プロシージャのsnapshot
パラメータでは、式の取得間隔を定義する次の値を使用できます。
-
CUMULATIVE
データベースでは、データベース作成以降のすべての式統計が考慮されます。
-
CURRENT
データベースでは、過去24時間の式統計のみが考慮されます。
-
WINDOW
データベースは、最新のユーザー指定式取得ウィンドウで追跡された式に非表示の仮想列を追加します。このウィンドウは、
IME_OPEN_CAPTURE_WINDOW
プロシージャを手動で起動して開き、IME_CLOSE_CAPTURE_WINDOW
プロシージャを手動で起動して閉じます。取得ウィンドウが現在開いている場合、データベースはこの時点までに現在のウィンドウで追跡されたすべての式を考慮し、最もホットな式をマテリアライズします。現在のウィンドウで追跡された式をリストするには、
SNAPSHOT = 'WINDOW'
でDBA_EXPRESSION_STATISTICS
を問い合せます。
ユーザー定義の時間間隔(snapshot='WINDOW'
)は、このウィンドウ内で発生する式のみをマテリアライズ用に考慮する場合に役立ちます。このメカニズムは、短い間隔がワークロード全体で代表的な場合に特に便利です。たとえば、取引時間帯の間に証券会社が一連の式を収集し、IM列ストアでそれらをマテリアライズして、ワークロード全体の将来の問合せ処理を高速化できます。
関連項目:
IME_OPEN_CAPTURE_WINDOW
、IME_CLOSE_CAPTURE_WINDOW
およびIME_CAPTURE_EXPRESSIONS
についてさらに学習するには、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照
7.1.2.2.2 非表示のSYS_IME仮想列
取得中、データベースにより最もホットな20個の式がそれぞれの表に非表示のSYS_IME
仮想列として追加され、デフォルトのINMEMORY
列圧縮句が適用されます。
前の呼出し中に追加されたSYS_IME
列が最新の式リストに表示されなくなった場合、その属性はNO INMEMORY
に変わります。
属性がINMEMORY
かどうかに関係なく、表のSYS_IME
列の最大数は50個です。表の式が上限の50個に達した後は、データベースにより、新しいSYS_IME
列は追加されません。新しい式を許可するには、SYS_IME
列をDBMS_INMEMORY.IME_DROP_EXPRESSIONS
またはDBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
プロシージャを使用して削除する必要があります。
SYS_IME
仮想列およびユーザー定義の仮想列のどちらも、表での列の上限である1000個に数えられます。たとえば、表に980個の非仮想(ディスク上)列が含まれる場合は、20個の仮想列のみを追加できます。
関連項目:
DBMS_INMEMORY_ADMIN
についてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照
7.1.2.3 ESSの仕組み
ESSは、式評価についての統計を格納するためにオプティマイザによって保持されるリポジトリです。
表ごとに、ESSで実行頻度や評価コストなどの式統計が保持されます。述語の評価時は、Oracle Databaseにより、式の評価回数および動的コストに関して実行時フィードバックが追跡および提供されます。ESS統計に基づいて、データベースで、特定の式がIM式であれば問合せのパフォーマンスが向上すると判断される場合があります。
ノート:
特定の表のESSにキャッシュされた式には、この表の列のみが含まれます。このルールは、Oracle Databaseで決定性のPL/SQL関数がIM式の候補として特定された場合は、特に重要となります。
図7-2 ESSとIM式
この図で、ESSではemployees
表で一般的に使用される2つの式、ROUND(salary*12/52,2)
および12*(salary*NVL(commission_pct,0)+salary)
が決定されました。データベースによってemployees
がIM列ストアに移入されると、2つのIMCUに列データが格納されます。各IMCUはそのIMEUのみと関連付けられ、これには、そのIMCU内の行に対して一般的に使用される2つの式の導出された値が含まれています。
![図7-2の説明が続きます 図7-2の説明が続きます](img/cncpt_vm_381.png)
「図7-2 ESSとIM式」の説明
すべての式がIM式の候補であるわけではありません。データベースでは、頻繫にアクセスされる式のみが考慮されます。IM式は非表示の仮想列として実装されるため、仮想列の制限事項を満たしている必要もあります。
IM列ストアはESSのクライアントですが、ESSはDatabase In-Memoryの機能から独立しています。オプティマイザ自体など、他のクライアントもESS統計を使用できます。
関連項目:
-
仮想列についてさらに学習するには、『Oracle Database管理者ガイド』を参照
7.1.2.4 データベースではどのようにIM式が移入されるか
インメモリー・コーディネータ・プロセス(IMCO)の指示に従い、領域管理ワーカー・プロセス(Wnnn)で、IM式がIMEUに自動的にロードされます。
データベースで、ユーザー定義またはIM式のどちらの仮想列を移入するかに関する情報とともに、すべてのインメモリー圧縮単位(IMCU)の移入または再移入タスクが増大されます。決定は、INMEMORY_EXPRESSION_USAGE
およびINMEMORY_VIRTUAL_COLUMNS
初期化パラメータの設定によって異なります。
ノート:
DBMS_INMEMORY.IME_CAPTURE_EXPRESSIONS
プロシージャは、自動検出した式を非表示の仮想列として追加します。
Wnnnプロセスにより、IMCUが作成されます。IMEUを作成するために、それらのプロセスで、次のようなステップがさらに実行されます。
-
式値を作成します
-
値を列形式に変換し、それらをインメモリー式単位(IMEU)に圧縮します
-
各IMEUをその関連するIMCUにリンクさせます
ノート:
IMEUに格納する式の数が増加すると、ワーカー・プロセスで、式値を計算するために少し多くのCPUが使用される場合があります。このオーバーヘッドにより、移入時間が長くなることがあります。
関連項目:
-
DBMS_INMEMORY.IME_CAPTURE_EXPRESSIONS
プロシージャについてさらに学習するには、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照
7.1.2.5 IMEUはどのようにIMCUに関連するか
どの行についても、物理的な列はIMCU内に存在し、仮想列は関連するIMEU内に存在します。IMEUは、IMCUと同様に、読取り専用であり、列となります。
IMEUは、特定のINMEMORY
セグメントのために作成されたIMCUの論理拡張であるため、デフォルトでは、INMEMORY
句、およびDISTRIBUTE
およびDUPLICATE
などのOracle Real Applications Cluster (Oracle RAC)プロパティを継承します。IMEUは、1つのIMCUのみと関連付けられます。データベースでは、追加および削除が容易になるよう、IMEUは別個の構造として管理されます。
ノート:
IMEUには、ユーザーが作成したIM仮想列も含まれます。
ソース・データが変更された場合は、データベースにより、再移入中に、IM式で得られたデータが変更されます。たとえば、トランザクションで表内の100個の給与値が更新された場合は、領域管理ワーカー・プロセス(Wnnn)により、変更されたこれら100個の値から導出されるすべてのIM式値が自動的に更新されます。データベースでは、最初にすべてのIMCUを再移入してからすべてのIMEUを再移入するのではなく、IMCUおよびその関連するIMEUが一緒に再移入されます。IMEUは、IMCUの再移入中も問合せに使用できます。
7.1.3 IM式のユーザー・インタフェース
DBMS_INMEMORY_ADMIN
パッケージ、DBMS_INMEMORY
パッケージおよびINMEMORY_EXPRESSIONS_USAGE
初期化パラメータは、IM式の挙動を制御します。
7.1.3.1 INMEMORY_EXPRESSIONS_USAGE
INMEMORY_EXPRESSIONS_USAGE
初期化パラメータは、どのタイプのIM式を移入するかを決定します。INMEMORY_VIRTUAL_COLUMNS
初期化パラメータは、通常の(非表示ではない)仮想列の移入を制御します。
IM列ストアが有効になっている(INMEMORY_SIZE
がゼロ以外)場合、INMEMORY_EXPRESSIONS_USAGE
は、データベースで移入されるIM式のタイプを制御します。INMEMORY_EXPRESSIONS_USAGE
初期化パラメータには、次のオプションがあります。
-
ENABLE
データベースでは、静的IM式と動的IM式の両方がIM列ストアに移入されます。この値を設定すると、一部の表でインメモリー・フットプリントが増加します。これはデフォルトです。
-
STATIC_ONLY
静的構成では、IM列ストアでOSON (バイナリJSON)列をキャッシュできます。それらは、
IS_JSON
チェック制約でマークされます。内部的には、OSON列はSYS_IME_OSON
という名前の非表示の仮想列です。 -
DYNAMIC_ONLY
データベースでは、
SYS_IME
非表示仮想列として表に追加された、頻繁に使用されているかホットな式のみが移入されます。この値を設定すると、一部の表でインメモリー・フットプリントが増加します。 -
DISABLE
データベースでは、静的か動的かに関係なく、IM式はIM列ストアに移入されません。
INMEMORY_EXPRESSIONS_USAGE
の値の変更により、現在IM列ストアに移入されているIM式への影響はすぐにはありません。たとえば、INMEMORY_EXPRESSIONS_USAGE
をDYNAMIC_ONLY
からDISABLE
に変更した場合は、データベースによって、格納されているIM式はすぐには削除されません。正確に述べると、次の再移入で、無効になっているIM式が除外されます。それにより、効率的にそれらが削除されます。
関連項目:
-
Database In-MemoryでのJSONの使用についてさらに学習するには、Oracle Database JSON開発者ガイドを参照
-
INMEMORY_EXPRESSIONS_USAGE
およびALL_JSON_COLUMNS
について学習するには、Oracle Databaseリファレンスを参照
7.1.3.2 DBMS_INMEMORY_ADMINおよびDBMS_INMEMORY
IM式を管理するには、DBMS_INMEMORY_ADMIN
およびDBMS_INMEMORY
パッケージを使用します。
IM式を管理するためのPL/SQLプロシージャ
パッケージ | プロシージャ | 説明 |
---|---|---|
|
|
このプロシージャは、式取得ウィンドウの開始を知らせます。 |
|
|
このプロシージャは、現在の式取得ウィンドウの終了を知らせます。 |
|
|
このプロシージャは、式取得ウィンドウの現在の取得状況および最新の変更のタイムスタンプを返します。 |
|
|
このプロシージャは、指定された時間範囲でデータベース内の最も頻繁にアクセスされている(最もホットな)式を20個取得します。 |
|
|
このプロシージャは、 |
|
|
このプロシージャは、データベース内のすべての |
|
|
このプロシージャは、指定された一連の |
関連項目:
DBMS_INMEMORY
およびDBMS_INMEMORY_ADMIN
パッケージについてさらに学習するには、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照
7.1.4 IM式のための基本作業
INMEMORY_EXPRESSIONS_USAGE
のデフォルト設定では、データベースで、動的および静的IM式の両方を使用できます。IM列ストアに式を移入するには、DBMS_INMEMORY_ADMIN
を使用する必要があります。
通常は、次の順序でIM式の作業を実行します。
-
必要な場合は、データベースで使用可能なIM式のタイプを変更します。
「IM式の使用の構成」を参照してください。
-
IM式を取得および移入します。
「IM式の取得および移入」を参照してください。
-
必要な場合は、IM式の一部またはすべてを削除します。
「IM式の削除」を参照してください。
7.2 IM式の使用の構成
必要な場合は、INMEMORY_EXPRESSIONS_USAGE
を使用して、移入の対象となるIM式のタイプを選択するか、すべてのIM式の移入を無効にします。
前提条件
データベースでのIM式の使用を可能にするには、次の条件を満たしている必要があります。
-
INMEMORY_SIZE
初期化パラメータがゼロ以外の値に設定されている。 -
初期化パラメータ
COMPATIBLE
の値が12.2.0以上に設定されている。
ノート:
Oracle Real Applications Cluster (RAC)データベースでは、INMEMORY_EXPRESSIONS_USAGE
初期化パラメータは、すべてのデータベース・インスタンスで同じ値である必要はありません。各IMCUは、独立して仮想列をリストします。各IMCUで、IMCUが移入または再移入されたときに存在していた初期化パラメータ値および仮想列に基づいて、様々な式をマテリアライズできます。
IM式の使用を構成するには:
-
適切な権限があるユーザーとしてデータベースにログインします。
-
IM式の使用を構成するには、
ALTER SYSTEM
文を使用して、INMEMORY_EXPRESSIONS_USAGE
を次のいずれかの値に設定します。-
ENABLE
(デフォルト)—動的および静的IM式を有効にします -
STATIC_ONLY
—静的IM式のみを有効にします -
DYNAMIC_ONLY
—動的IM式のみを有効にします -
DISABLE
—すべてのIM式を無効にします
-
例7-1 IM式の無効化
次の文は、IM列ストア内のIM式の記憶域を無効にします。
ALTER SYSTEM SET INMEMORY_EXPRESSIONS_USAGE='DISABLE' SCOPE=BOTH;
関連項目:
INMEMORY_EXPRESSIONS_USAGE
についてさらに学習するには、『Oracle Databaseリファレンス』を参照してください。
7.3 IM式の取得および移入
IME_CAPTURE_EXPRESSIONS
プロシージャは、指定された時間間隔でデータベース内の最も頻繁にアクセスされている(最もホットな)式を20個取得します。IME_POPULATE_EXPRESSIONS
プロシージャは、DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
の最後の呼出しで取得された式の移入を強制的に実行します。
IME_CAPTURE_EXPRESSIONS
プロシージャを呼び出したときは必ず、データベースで、式統計ストア(ESS)に問合せが行われ、IM列ストアに少なくとも一部分が移入されているヒープ構成表の式のみが考慮されます。データベースにより、最もホットな20個の式がそれぞれの表に、文字列SYS_IME
という接頭辞が付いた非表示の仮想列として追加され、デフォルトのINMEMORY
列圧縮句が適用されます。前の呼出し時に追加されたSYS_IME
列が、最新の上位20件のリスト内になくなると、その属性はNO INMEMORY
に変わります。
IME_POPULATE_EXPRESSIONS
を呼び出さない場合、データベースでは、SYS_IME
列は、それらの親IMCUが再移入されるときに段階的に再移入されます。表が再移入されない場合、データベースでは、IME_CAPTURE_EXPRESSIONS
プロシージャによって取得された新しいSYS_IME
列は再移入されません。IME_POPULATE_EXPRESSIONS
は、再移入を強制的に実行することで、この問題を解決します。
IME_POPULATE_EXPRESSIONS
プロシージャは、内部的に、INMEMORY
属性が指定されているSYS_IME
列があるすべての表に対して、DBMS_INMEMORY.REPOPULATE
を呼び出します。指定された表サブセット内のSYS_IME
列を移入するには、DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS
ではなくDBMS_INMEMORY.REPOPULATE
を使用します。
前提条件
データベースでのIM式の取得を可能にするには、次の条件を満たしている必要があります。
-
INMEMORY_EXPRESSIONS_USAGE
初期化パラメータがDISABLE
以外の値に設定されている必要があります。 -
INMEMORY_SIZE
初期化パラメータがゼロ以外の値に設定されている。 -
初期化パラメータ
COMPATIBLE
の値が12.2.0以上に設定されている必要があります。 -
(事前に決められた24時間またはそれより長い時間範囲ではなく)任意の長さの式取得ウィンドウを指定するには、
DBMS_INMEMORY_ADMIN.IME_OPEN_CAPTURE_WINDOW
を使用してウィンドウを開き、IME_CLOSE_CAPTURE_WINDOW
を使用して閉じる必要があります。ウィンドウは、Oracle RACデータベースのすべてのインスタンスにわたってグローバルです。
IM式を取得および移入するには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
(事前に決められた時間範囲ではなく)ウィンドウの長さを指定する場合は、次のように
DBMS_INMEMORY_ADMIN.IME_OPEN_CAPTURE_WINDOW
を実行します。EXEC DBMS_INMEMORY_ADMIN.IME_OPEN_CAPTURE_WINDOW();
ノート:
式取得ウィンドウが現在開いているかどうかを確認するには、
DBMS_INMEMORY_ADMIN.IME_GET_CAPTURE_STATE
を実行します。 -
前述のステップで
IME_OPEN_CAPTURE_WINDOW
を使用してウィンドウを開いた場合、次のようにIME_CLOSE_CAPTURE_WINDOW
を使用して閉じます。EXEC DBMS_INMEMORY_ADMIN.IME_CLOSE_CAPTURE_WINDOW();
-
DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS
を実行し、interval
パラメータを次のいずれかの値に設定します。-
CUMULATIVE
データベースでは、データベース作成以降のすべての式統計が考慮されます。
-
CURRENT
データベースでは、過去24時間の式統計のみが考慮されます。
-
WINDOW
データベースは、最新のユーザー指定式取得ウィンドウで追跡された式に非表示の仮想列を追加します。このウィンドウは、
IME_OPEN_CAPTURE_WINDOW
プロシージャを手動で起動して開き、IME_CLOSE_CAPTURE_WINDOW
プロシージャを手動で起動して閉じます。取得ウィンドウが現在開いている場合、データベースはこの時点までに現在のウィンドウで追跡されたすべての式を考慮し、最もホットな式をマテリアライズします。現在のウィンドウで追跡された式をリストするには、
SNAPSHOT = 'WINDOW'
でDBA_EXPRESSION_STATISTICS
を問い合せます。
-
-
必要に応じて、取得されたすべてのIM式の即時移入を強制的に実行するには、次のように
DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS
を実行します。EXEC DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
例7-2 ユーザー定義ウィンドウでの式の取得
この例は、WINDOW
取得モードの使用方法を示しています。目標は、式取得ウィンドウを開いて閉じ、この時間帯の間にデータベースが追跡したすべての式を取得することです。次のステップを実行します。
-
式取得ウィンドウを開き、式を生成してからウィンドウを閉じます。
EXEC DBMS_INMEMORY_ADMIN.IME_OPEN_CAPTURE_WINDOW(); -- Generate expressions for the database to track EXEC DBMS_INMEMORY_ADMIN.IME_CLOSE_CAPTURE_WINDOW();
-
問合せ
DBA_EXPRESSION_STATICS
(出力例を含む)。COL OWNER FORMAT A6 COL TABLE_NAME FORMAT A9 COL COUNT FORMAT 99999 COL CREATED FORMAT A10 COL EXPRESSION_TEXT FORMAT A29 SELECT OWNER, TABLE_NAME, EVALUATION_COUNT AS COUNT, CREATED, EXPRESSION_TEXT FROM DBA_EXPRESSION_STATISTICS WHERE SNAPSHOT = 'WINDOW' AND OWNER = 'SH'; OWNER TABLE_NAM COUNT CREATED EXPRESSION_TEXT ------ --------- ------ ---------- ------------------------- SH SALES 4702 09-OCT-17 "QUANTITY_SOLD" SH SALES 4702 09-OCT-17 "QUANTITY_SOLD"*"AMOUNT_SOLD" SH SALES 4702 09-OCT-17 "PROD_ID" SH SALES 4702 09-OCT-17 "CUST_ID" SH SALES 4702 09-OCT-17 "CHANNEL_ID" SH SALES 4702 09-OCT-17 "AMOUNT_SOLD"
前述の問合せは、ESSで追跡された列と、
sh
スキーマ内の問合せの時間帯の間に取得された式の両方を示します。最新の時間帯の間に、データベースは1つの式(QUANTITY_SOLD*AMOUNT_SOLD
)を取得しました。 -
IME_CAPTURE_EXPRESSIONS
を使用して、現在のウィンドウ内のすべての式がマテリアライズできるかをデータベースに検討させます。EXEC DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS('WINDOW');
-
問合せ
DBA_IM_EXPRESSIONS
(出力例を含む)。COL OWNER FORMAT a6 COL TABLE_NAME FORMAT a9 COL COLUMN_NAME FORMAT a25 SET LONG 50 SET LINESIZE 150 SELECT OWNER, TABLE_NAME, COLUMN_NAME, SQL_EXPRESSION FROM DBA_IM_EXPRESSIONS; OWNER TABLE_NAM COLUMN_NAME SQL_EXPRESSION ------ --------- ------------------------- ----------------------------- SH SALES SYS_IME000100000025201B "QUANTITY_SOLD"*"AMOUNT_SOLD"
前述の出力には、表に追加され、最新の
IME_CAPTURE_EXPRESSIONS
呼出しの一部としてINMEMORY
とマークされたすべての仮想列が表示されます。データベースは、表の様々なIMCUを再移入するときに、取得した式をIM列ストアに段階的に移入します。 -
次の手順を実行して、取得されたすべてのIM式の移入を明示的に強制します。
EXEC DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
force
パラメータをTRUE
に設定してDBMS_INMEMORY.REPOPULATE
プロシージャを実行することにより、特定の表からIM式を移入できることに注意してください。
例7-3 式取得ウィンドウの状態の判断
この例では、式取得ウィンドウを開き、その取得状態を判断します。
EXEC DBMS_INMEMORY_ADMIN.IME_OPEN_CAPTURE_WINDOW();
VARIABLE b_state VARCHAR2(25)
VARIABLE b_time VARCHAR2(10)
EXECUTE DBMS_INMEMORY_ADMIN.IME_GET_CAPTURE_STATE(:b_state, :b_time)
PRINT b_state b_time
次の出力例は、式取得ウィンドウが現在開いていることを示しています。
B_STATE
--------------------------------------------------
OPEN
B_TIME
--------------------------------------------------
09-OCT-17
例7-4 過去24時間の上位20件のIM式の取得
この例では、最後の日に収集された統計のみを使用してIM式を取得してから、即時移入を強制的に実行します。
EXEC DBMS_INMEMORY_ADMIN.IME_CAPTURE_EXPRESSIONS('CURRENT');
EXEC DBMS_INMEMORY_ADMIN.IME_POPULATE_EXPRESSIONS();
次のDBA_IM_EXPRESSIONS
の問合せでは、INMEMORY
とマークされているすべてのIME仮想列を示しています(出力例を提供)。
COL OWNER FORMAT a6
COL TABLE_NAME FORMAT a9
COL COLUMN_NAME FORMAT a25
SET LONG 50
SET LINESIZE 150
SELECT OWNER, TABLE_NAME,
COLUMN_NAME, SQL_EXPRESSION
FROM DBA_IM_EXPRESSIONS;
OWNER TABLE_NAM COLUMN_NAME SQL_EXPRESSION
------ --------- ------------------------- ---------------------------------------------
HR EMPLOYEES SYS_IME00010000001746FD 12*("SALARY"*NVL("COMMISSION_PCT",0)+"SALARY")
HR EMPLOYEES SYS_IME00010000001746FE ROUND("SALARY"*12/52,2)
関連項目:
-
IME_CAPTURE_EXPRESSIONS
およびIME_POPULATE_EXPRESSIONS
についてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照 -
DBA_IM_EXPRESSIONS
ビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照
7.4 IM式の削除
DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
プロシージャは、データベース内のすべてのSYS_IME
式仮想列を削除します。DBMS_INMEMORY.IME_DROP_EXPRESSIONS
プロシージャは、指定された一連のSYS_IME
仮想列を表から削除します。
SYS_IME
列を削除する一般的な理由は、領域およびパフォーマンスです。属性がINMEMORY
かNO INMEMORY
かに関係なく、表のSYS_IME
列の最大数は50個です。1つの表に対して式が上限の50個に達すると、データベースにより、新しいSYS_IME
列は追加されなくなります。新しい式のために領域を作り出すには、DBMS_INMEMORY.IME_DROP_EXPRESSIONS
またはDBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
プロシージャを使用して、SYS_IME
列を手動で削除する必要があります。
IME_DROP_ALL_EXPRESSIONS
プロシージャは、INMEMORY
属性の有無に関係なく、すべての表からすべてのSYS_IME
列を削除します。事実上、このプロシージャは、データベース規模のリセット・ボタンの役割を果たします。
IME_DROP_ALL_EXPRESSIONS
を使用すると、SYS_IME
列があるセグメントのすべてのIMEUおよびIMCUの削除がトリガーされます。たとえば、移入された50個の表にそれぞれ1つのSYS_IME
列がある場合は、IME_DROP_ALL_EXPRESSIONS
によって、IM列ストアから50個すべての表が削除されます。これらのセグメントを再度移入するには、DBMS_INMEMORY.POPULATE
プロシージャを使用するか、表の全体スキャンを実行する必要があります。
前提条件
IM式を削除するには、次の条件を満たしている必要があります。
-
INMEMORY_EXPRESSIONS_USAGE
初期化パラメータは、DISABLE
以外の値に設定されています。 -
INMEMORY_SIZE
初期化パラメータがゼロ以外の値に設定されています。 -
COMPATIBLE
初期化パラメータが12.2.0以上に設定されています。
IM式を削除するには:
-
SQL*PlusまたはSQL Developerで、必要な権限を持つユーザーとしてデータベースにログインします。
-
DBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
またはDBMS_INMEMORY.IME_DROP_EXPRESSIONS
のどちらかを実行します。IME_DROP_EXPRESSIONS
を実行する場合は、次のパラメータを指定します。-
schema_name
— インメモリー表を含むスキーマの名前 -
table_name
— インメモリー表の名前 -
column_name
—SYS_IME
列の名前。デフォルトでこの値はnullで、この表内のすべてのSYS_IME
列を指定します。
-
例7-5 表内のすべてのIM式の削除
この例では、hr.employees
表内のすべてのIM式を削除します。
EXEC DBMS_INMEMORY.IME_DROP_EXPRESSIONS('hr', 'employees');
関連項目:
-
INMEMORY_EXPRESSIONS_USAGE
初期化パラメータについてさらに学習するには、『Oracle Databaseリファレンス』を参照 -
DBMS_INMEMORY.IME_DROP_EXPRESSIONS
およびDBMS_INMEMORY_ADMIN.IME_DROP_ALL_EXPRESSIONS
についてさらに学習するには、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照 -
DBA_IM_EXPRESSIONS
データ・ディクショナリ・ビューについてさらに学習するには、『Oracle Databaseリファレンス』を参照