メモリ使用量とスワップポリシーの構成¶
Virtual DataPort には、大規模なデータセットの処理でメモリのオーバーフローを回避する手段として以下の 3 種類が用意されています。
データソースにある未処理データのサイズが一定の制限値 ([Maximum size in memory of intermediate results] (MB)) を超えている場合、そのソースからのデータ取得を停止する。
スワップメカニズムを有効にする。これにより、クエリの実行結果のサイズが一定の制限を超えると、その中間結果がセカンダリストレージに格納されます。また、ソート操作 (
ORDER BY
を使用したクエリ) の中間結果もスワップされます。この機能は、[Swapping status] および [Maximum size in memory of each node] で構成します。あらゆるクエリで使用する最大メモリ量を制限する ([Maximum query size] (MB))。
これらの設定を変更するには、[Administration] メニューで [Server configuration] をクリックし、[Memory Usage] をクリックします (「 Memory Usage configuration 」を参照)。
デフォルトでは、すべてのデータベースとそのビューで、このダイアログで設定したメモリ使用量とスワップ構成が使用されます。ただし、データベースやビューに独自の設定を指定することもできます。
特定のデータベースでこの設定を変更する方法については「 データベースの構成および削除 」を参照してください。
各データベースの設定は Virtual DataPort サーバーによる設定よりも優先され、特定のビューの設定はデータベースによる設定よりも優先されます。
メモリ使用量の設定¶
ビューにクエリを実行すると、Virtual DataPort によってソースから必要なデータが取得されます。状況によっては、このデータ取得が一時的に停止した後、再開されることがあります。以下にその例を示します。
リクエストしたデータが、あるソースから他のソースよりも高速で提供される場合。たとえば、2 つの JDBC データソースを使用する結合ビューにクエリを実行するときに、一方の JDBC データソースはきわめて高性能なマシンで実行されているデータベースに接続し、他方のソースは低速なマシンで実行されているデータベースに接続している場合です。
複雑な結合条件を指定した結合ビューをクエリで使用していることから、データの取得に要する時間よりもデータの評価に要する時間の方が長い場合。
以上の各状況では、ソースから取得する未処理データのサイズが [Maximum size in memory of intermediate results] フィールドの値 (MB) を超えると、このソースからのデータ取得が一時的に停止します。Virtual DataPort サーバーによるデータ処理が進行し、メモリに格納されているデータサイズが減少すると、データ取得が再開されます。
スワップ設定¶
[Swapping status on] をクリックすると、[Advanced] ダイアログで [Swapping status Default] オプションを選択したすべてのビューでスワップエンジンが有効になります。また、以下の各パラメータのデフォルト値を変更できます。
Maximum size in memory of each node (MB): クエリの実行中に、非ストリーミング処理の実行で生成された中間結果がこのパラメータで指定した最大サイズを超えると、その中間結果がディスクにスワップされます。
Maximum size of the blocks written to disk (KB): 中間結果をディスクにスワップする場合、ここで指定した値が、その読み取り操作と書き込み操作で扱われる最大サイズになります。この設定は、変更するとただちに有効になります。
Virtual DataPort では、以下の状況でデータがディスクへスワップされます。
並べ替え: ソースに委任されない ORDER BY をビューやクエリで実行する場合。ここでは、Virtual DataPort サーバーでクエリの結果セットの並べ替えを開始するには、それらの行をすべて受信するまで待機する必要があります。受信したデータのサイズが [Maximum size in memory of each node] を超えると、並べ替えを必要とするデータがディスクにスワップされるようになります。すべてのデータが受信されると、Virtual DataPort サーバーで並べ替えが開始されます。
グループ化: ソースに委任されない GROUP BY をビューやクエリで実行する場合。ここでは、Virtual DataPort サーバーでこの操作を開始するには、クエリの結果セットの行をすべて受信するまで待機する必要があります。受信したデータのサイズが [Maximum size in memory of each node] を超えると、グループ化を必要とするデータがディスクにスワップされるようになります。
ディスクへのデータのスワップを必要としない例外を以下に示します。
ビューやクエリでフィールドの値が投影される場合。
ビューやクエリで「累積」関数の結果が投影される場合。このような関数として、
AVG
、COUNT
、SUM
、MAX
、MIN
があります。
ハッシュ結合: Virtual DataPort サーバーでハッシュ結合が実行される場合、まず結合の右側分岐のデータがすべて読み込まれ、つづいて左側分岐からデータ処理が開始されます。右側分岐から読み込まれたデータのサイズが [Maximum size in memory] で指定した値を超えると、結合条件に応じて、Virtual DataPort サーバーの動作が次のように変化します。
結合条件で演算子 =、<、<=、>、>= を使用している場合は、両方の分岐のデータが結合属性で並べ替えられ、結合方法がマージに変更されます。データを並べ替えできるように、データがディスクにスワップされます。
結合条件で上記以外の演算子 (
like
など) を使用している場合は、結合の右側分岐から取得されたデータのディスクへのスワップが開始されます。右側分岐のデータがすべて取得されると、スワップ済みデータがブロック単位で読み取られ、結合が実行されます。
差結合 操作と 積結合 操作: メモリ管理やスワップの観点から見ると、これらの操作はハッシュ結合同様に機能します。したがって、ハッシュ結合と同じ状況でデータがディスクにスワップされます。
マージ結合: マージ結合は最も効率的な結合方法であり、そのメモリ使用量はきわめて少ないことが普通ですが、例外的にメモリ使用量が多くなる状況として以下の 2 つがあります。
結合の右側分岐の行に、結合属性の値が同じ行が多数存在する場合。
結合条件で不等号演算子 (<、<=、>、>=、like など) を使用している場合。
このような状況で、結合の右側分岐の行が左側分岐の行と一致するかどうかを確認するには、右側分岐から多数の行をメモリに保持しておく必要があります。右側分岐から取得したデータの量が、[Maximum size in memory] で指定した値を超えると、右側分岐のデータがディスクにスワップされるようになります。
データをキャッシュする場合: ビューのキャッシュを有効にして、そのビューのキャッシュデータを扱うクエリを実行した場合、Virtual DataPort サーバーでは、クエリ結果をキャッシュデータベースに格納すると同時に、クエリの実行元クライアントにクエリ結果を返す必要があります。キャッシュデータベースにデータを格納する処理には、クライアントへデータを返す処理よりも長時間を要します。したがって、Virtual DataPort サーバーでは、キャッシュに未格納のクエリ結果をメモリに保持しておく必要があります。このデータのサイズが、[Maximum size in memory] で指定した値を超えると、データがディスクにスワップされるようになり、スワップされたデータが少しずつ取得されてキャッシュデータベースに挿入されます。
これには例外があります。クエリの
CONTEXT
句にパラメータ'cache_return_query_results' = 'false'
を追加すると、メモリのオーバーフローを回避するためにクエリ結果をスワップする必要がなくなります。
注釈
VQL の CONTEXT
句を使用すると、「スワップ」が動的に使用されるようにクエリを構成できます。詳細については、『VQL ガイド』の「 スワップポリシーの構成 」を参照してください。
クエリの最大サイズ¶
デフォルトでは、クエリで使用できる合計メモリ量が制限されています。この制限を変更するには、[Maximum query size (MB)] ボックスの値を変更します。
「 メモリ管理 」では、Virtual DataPort でメモリ管理がどのように機能するかを説明しています。また、そのサブセクションの「 クエリの最大メモリ使用量の制限 」では、このウィザードで設定した制限がどのように適用されるかを重点的に取り上げています。