SAP HANA コックピットを使用した管理

デルタマージの概念の説明

Objective

After completing this lesson, you will be able to デルタマージプロセスについて説明してください。

カラムストアにおけるメモリ管理

カラムストアは、列に編成されたデータをインメモリで管理する SAP HANA データベースの部分です。カラムテーブルとして登録されたテーブルはここに保存されます。

デルタマージ操作

デルタマージ操作の目的は、デルタストレージで収集された変更を読込用に最適化されたメインストレージに移動することです。デルタマージ操作の後、メインストレージのコンテンツがディスクに保持されます。必要に応じて、圧縮が再計算されて最適化されます。デルタマージ操作は複数のイベントによってトリガすることができ、非同期で実行されます。

デルタマージ操作のその他の実行結果として、デルタログが切り詰められます。デルタストレージ構造自体はインメモリにのみ存在し、ディスクには保持されません。カラムストアでは、デルタストレージに対して実行されたすべての操作について論理 REDO ログエントリが登録されます。このログはデルタログと呼ばれます。システムの再起動が発生すると、デルタログエントリが再生され、インメモリデルタストレージが再構築されます。デルタストレージでの変更がメインストレージにマージされると、マージ操作の前に書き込まれたエントリを削除することで、デルタログファイルが切り詰められます。

注記

デルタストレージ内のデータのロードまたはアンロードは、全体を対象として行うしかありません。部分ロードには対応していません。したがって、デルタマージが実行されておらず、テーブルのデータ全体がデルタストレージにある場合、テーブル全体がロードまたはアンロードされます。

デルタマージプロセス

この図は、データ管理システムでのマージ前、マージ中、およびマージ後のデータ操作の順次プロセスを示しています。

マージプロセスでは、以下のステップが実行されます。

  1. マージ操作の前に、すべての書込操作がデルタ 1 ストレージに移動し、すべての読込操作がメイン 1 ストレージおよびデルタ 1 ストレージに対して実行されます。

  2. マージ操作の実行中に、以下のイベントが発生します。

    1. すべての書込操作が 2 つ目のデルタストレージ (デルタ 2) に移動します。

    2. 読込操作が元のメインストレージ (メイン 1) および両方のデルタストレージ (デルタ 1 とデルタ 2) に対して実行されます。

    3. デルタ 1 の未コミット状態の変更がデルタ 2 にコピーされます。

    4. メイン 1 のコンテンツとデルタ 1 のコミット済エントリが新しいメインストレージ (メイン 2) にマージされます。

  3. マージ操作が完了すると、以下のイベントが発生します。

    1. メイン 1 ストレージおよびデルタ 1 ストレージが削除されます。

    2. 新しいメインストレージ (メイン 2) の圧縮が再評価されて最適化されます。必要な場合は、この操作によって行が並べ替えられ、圧縮パラメータが調整されます。圧縮が変更された場合、列は即座にメモリに再ロードされます。

    3. メインストレージ全体のコンテンツはディスクに保持されます。

注記

このダブルバッファコンセプトでは、未処理トランザクションがデルタ 2 に移動されるプロセスの開始時、およびストレージの "切替" が行われるプロセスの終了時に、テーブルを短時間だけロックする必要があります。

注意

デルタマージ操作に必要な最小メモリ所要量には、メインストレージの現在のサイズ、メインストレージの将来のサイズ、デルタストレージの現在のサイズ、そしてある程度の追加メモリが含まれます。カラムストアテーブルがアンロードされたり、一部がロードされたりしている場合でも、デルタマージを実行するためにテーブル全体がメモリにロードされます。

テーブルのデルタマージの実行

デフォルトでは、SAP HANA によってデルタマージプロセスが自動的に制御されます。ただし、状況によっては、マージ操作をマニュアルでトリガする必要があったり、そのほうが有用であったりします。たとえば、これは以下の場合に発生します。

  • テーブルがデルタストレージの最大サイズのしきい値を超えているために、アラートが発行された場合

  • メモリを解放する必要がある場合

テーブルのデルタマージは、SAP HANA コックピットの Current Table Distribution アプリケーションで操作を実行することで、マニュアルでトリガすることができます。

  1. Database Overview 画面で、Administration ビューまたは All ビューを選択した状態で、Table Distribution カードの View Current Table Distribution リンクを選択します。
  2. オプションで、フィルタリングまたは検索オプションを使用して、目的のテーブルを照会します。
  3. テーブルを左クリックします。
  4. デルタマージが可能な場合は、コンテキストメニューに Delta Merge が表示されます。それを選択します。
  5. Yes を選択して確定します。
この図は、SAP Data Warehouse Cloud のテーブルストレージのデルタマージプロセスを示しています。

カラムテーブルの実行時情報をチェックするには、SAP HANA コックピットの Current Table Distribution アプリを使用し、テーブルを左クリックして Show Runtime Data 機能を選択するか、Database Explorer を使用してカタログ領域でテーブルを開き、対応するタブを選択してサイズに関する詳細を取得します。

デルタマージ操作によってデルタストレージからメインストレージにデータが移動されますが、デルタストレージのサイズはゼロにはなりません。これは、デルタマージ操作の実行中に、未処理トランザクションによって書き込まれたレコードが新しいデルタストレージに移動されるためです。さらに、デルタストレージのデータコンテナが空である場合でも、若干のインメモリ領域を必要とします。

デルタマージのタイプおよびパフォーマンス側面

デルタマージ操作の負荷が高い理由

デルタマージ操作には、以下の理由により負荷が高くなる可能性があります。

  • テーブルのすべての列のメインストレージ全体がインメモリで書き換えられます。その際、いくつかの中央処理装置 (CPU) リソースが使用され、メインストレージに必要なメモリが一時的に複製されます (一方、メイン 1 とメイン 2 は並列に存在します)。

  • 比較的少数のレコードのみが変更された場合でも、メインストレージ全体がディスクに保持されます。これにより、ディスク入出力ロードが生じます。

パフォーマンスに対するこの潜在的な悪影響は、以下の方針によって軽減することができます。

  • メモリ限定マージの実行

    メモリ限定マージはインメモリ構造にのみ影響し、データは保持されません。

  • テーブルの分割

    デルタマージのパフォーマンスはメインストレージのサイズに依存します。このサイズは、テーブルをそれぞれ独自のメインストレージとデルタストレージを持つ複数のパーティションに分割することで削減することができます。デルタマージ操作は、パーティションレベルで、実際にそれを必要とするパーティションに対してのみ実行されます。つまり、マージされて保持されるデータが少なくなります。テーブルのパーティション分割にはデメリットがあることにも留意してください。

マージモチベーション

テーブルのデルタストレージをそのメインストレージにマージする要求は、いくつかの方法によってトリガされます。これらをマージモチベーションと呼びます。

図 "マージモチベーション" は、さまざまなマージモチベーションとそのトリガ方法を示しています。

この図は、自動システムとユーザアプリケーションにおけるさまざまなタイプのマージプロセスを示しています。

自動マージ

SAP HANA においてマージを開始する標準的な方法は自動マージです。mergedog と呼ばれるシステムプロセスにより、ローカルにロードされるカラムストアテーブルが定期的にチェックされます。個々のテーブルまたは分割テーブルの単一パーティションごとに、特定の基準 (デルタストレージのサイズ、使用可能なメモリ、前回のマージ以降の時間など) に基づいて、マージが必要かどうかが決定されます。

indexserver.ini ファイルの mergedog セクションの active パラメータが yes に設定されている場合、自動マージは有効です。

注記

TABLES (SYS) システムビューで、個別のテーブルの自動マージを有効化または無効化することができます。AUTO_MERGE_ON 列の値を TRUE または FALSE に変更します。

スマートマージ

SAP HANA で動作するアプリケーションから、マージプロセスをより直接的に制御する必要がある場合、デルタマージを行う意味があるかどうかをシステムにチェックさせる機能を利用できます。この機能はスマートマージと呼ばれます。たとえば、アプリケーションで比較的大きなデータボリュームのロードが開始された場合、そのロード中にデルタマージを行うことはロードのパフォーマンスとその他のシステムユーザの両方に対して悪影響をもたらす場合があります。このため、アプリケーションではロード中のテーブルに対して自動マージを無効化し、ロードが完了したらマージを行うようデータベースに "ヒント" を送信することができます。

マージをトリガするために、アプリケーションからデータベースに対してスマートマージヒントが発行されると、データベースによりマージが必要かどうかを判断するための基準が評価されます。基準を満たした場合、マージが実行されます。基準を満たしていない場合、データベースでは追加のアクションは実行されません。アプリケーションから後続のヒントが発行された場合にのみ、基準が改めて評価されます。

indexserver.ini ファイルの smart_merge_enabled セクションの active パラメータが yes に設定されている場合、スマートマージは有効です。

注意

スマートマージによってマージするテーブルに対して、自動マージを無効化してください。そうしないと、自動マージとスマートマージが相互に干渉する可能性があります。

ハードマージおよび強制マージ

SQL 文 MERGE DELTA OF "<table_name>" を実行して、テーブルのデルタマージ操作をマニュアルでトリガすることができます。これはハードマージと呼ばれます。十分なシステムリソースが利用可能な場合、または十分なシステムリソースが利用可能になったらすぐに、データベースでテーブルのデルタマージが実行されます。そのため、ハードマージはマージトークン制御メカニズムの対象となります。

システムリソースの利用可否に関係なくマージを即座に実行する場合は、オプションのパラメータを渡すことができます。強制マージは、システム負荷が高いものの、小さいテーブルをマージする必要がある場合に役立ちます。また、特定のテーブルのマージに失敗すると、システムパフォーマンスに悪影響が及ぶ場合にも有用です。強制マージを実行するには、SQL 文 MERGE DELTA OF '<table_name>' WITH PARAMETERS ('FORCED_MERGE' = 'ON') を実行します。

注記

システムによってトリガされるデルタマージ操作とは異なり、ここに一覧表示されているマニュアル実行のデルタマージ操作は、後でテーブルの新しいメインストレージの圧縮最適化をトリガすることはありません。デルタマージ操作の前にテーブルが圧縮されていた場合、そのテーブルはそれ以降も同じ圧縮方針を使用して圧縮されたままになります。デルタマージ操作前に圧縮されていなかった場合、それ以降も未圧縮のままになります。そのため、マニュアルでデルタマージを実行した後は、圧縮最適化をマニュアルでトリガする必要があります。

クリティカルマージ

システムの安定性を維持するために、データベースでクリティカルマージをトリガすることができます。たとえば、自動マージが無効化され、スマートマージヒントがシステムに送信されない場合、デルタストレージのサイズが大きくなり過ぎ、デルタマージを正常に行えなくなる可能性があります。あるしきい値を超えると、システムで自動的にクリティカルマージが開始されます。

パラメータ

圧縮最適化のしきい値

圧縮最適化が発生するしきい値は、以下の表に示すとおり、パラメータとして定義されます。

パラメータDefault説明
ActiveYes圧縮最適化のステータス
min_change_ratio1.75必要な最小の変更行数 (率)
min_hours_since_last_merge_of_part24パートのマージをする最短の時間間隔
min_rows10240最低限必要な行数 (テーブルに保存されたもの)

この圧縮データに対する書込操作は高負荷になります。これは、ストレージ構造を再編成する必要があるためです。そのため、カラムストアでの書込操作では、圧縮データが直接変更されることはありません。すべての変更がデルタストレージと呼ばれる別の領域で行われます。デルタストレージは、メインメモリにのみ存在します。デルタエントリが挿入された場合、デルタログエントリのみがパーシスタンスレイヤに書き込まれます。

デルタマージ操作の機能

デルタマージ操作の機能は以下のとおりです。

  • デルタマージ操作はテーブルレベルで実行されます。

  • その変更は書込用に最適化されたデルタストレージに収集されてから、圧縮されて読込用に最適化されたメインストレージに移動されます。

  • 読込操作では、常にメインストレージとデルタストレージの両方から読込が行われ、その結果がマージされます。

  • デルタマージ操作は、変更を行うトランザクションの実行とは分けられています。デルタマージ操作は、後の時点で非同期的に行われます。

注記

デルタマージ操作では、ダブルバッファコンセプトが使用されます。このメリットは、テーブルのロックが短時間で済むことです。詳細については、管理ガイドを参照してください。

注意

デルタマージ操作に必要な最小メモリ所要量には、メインストレージの現在のサイズ、メインストレージの将来のサイズ、デルタストレージの現在のサイズ、そしてある程度の追加メモリが含まれます。カラムストアテーブルがアンロードされたり、一部がロードされたりしている場合でも、デルタマージを実行するためにテーブル全体がメモリにロードされます。