ストリーミング操作のエッジケース¶
「 ストリーミング演算子と非ストリーミング演算子 」で説明したように、ストリーミング演算子 (マージ結合、ネスト結合、和結合、選択、投影など) を排他的に使用してデータを結合する場合、Denodo で処理する必要がある行数に関係なく、クエリのメモリ消費量は最小限になるはずです。ただし、大量にメモリを消費する可能性があるエッジケースがいくつか存在します。
非ストリーミングデータソース。一部のデータソースは、「ストリーミングモード」でデータを返すことをサポートしません。その場合、Denodo は、データソースから返されるすべての結果をメモリに保存する必要があります。返される行数が多い場合、大量にメモリを消費する可能性があります。大量のデータを返す可能性があるほとんどのデータソース (データベースなど) は、クライアントアプリケーションが大量の結果セットを保存することを強制されないように、何らかの形でストリーミングをサポートします。メモリオーバーフローを回避するために、可能な場合は常にストリーミングが使用されることを保証します。
長い行。ストリーミング演算子では、Denodo は結果セットを 1 行ずつ処理するので、通常は少量の行のみが一度にメモリに存在する必要があります。それでも、行が非常に長い場合、クエリは大量のメモリを消費します。複雑な階層データを含む行は、このケースに該当します (Denodo では配列およびレジスターのデータ型を使用して複雑な階層データを表現できる)。
たとえば、デフォルトでは、Denodo XML データソースは、クエリの結果全体を含む 1 行を作成します (後でフラット化を使用して複数の行に分割可能)。特定の XML データサービスがサイズの大きいドキュメントを返すことが考えられる場合、ビューの作成ウィザードで [Tuple Root] オプションを使用してドキュメントを複数の行に分割して、この問題を回避します。その手順については、「 XML ソース 」を参照してください。
JSON Web サービスや SOAP Web サービスなど、複雑な階層データを返すことが一般的な他のデータソースでも同様のオプションがあります。
低速のデータソース (または低速のクライアントアプリケーション)。「 ストリーミング演算子と非ストリーミング演算子 」で説明したように、Denodo は、クエリで使用されている複数のデータソースからパラレルにデータを取得します。Denodo が A と B の 2 つのビューを結合していて、データが結合属性によってすでに並べ替えられている (したがって、結合をストリーミング演算子を使用して実行できる) とします。さらに、データソース A の方がデータソース B よりはるかに高速であるとします。この場合、データソース A のスレッドが処理した行がメモリに蓄積される傾向があります。なぜなら、それらの行は、一致する B の行を受信するまで処理できないからです。蓄積される行数が多くなり過ぎるのを回避するために、Denodo は処理待ちの行を蓄積するために使用できるメモリの最大量を、[Maximum size in memory of intermediate results] パラメータを使用して制限します。これにより、一方のデータソースがどんなに低速でも、メモリ使用量が増えて制御不能になることはなくなります。
デフォルトでは、Denodo は、[Maximum size in memory of intermediate results] パラメータに比較的小さな値を使用します (「 クエリの最大メモリ使用量の制限 」で説明している、クエリの最大メモリ消費量を制限するメカニズムも、必要に応じて自動的にメモリ消費量を減少させる)。通常はこの値を変更する必要はありませんが、非常に特殊なケースではこの値を増やすことでパフォーマンスを向上させられます。以下に例を示します。
A (Salesforce などの SaaS アプリケーションであるデータソース DS1 から生成) と B (Virtual DataPort サーバーと同じネットワークに存在するデータベースであるデータソース DS2 から生成) の 2 つのビューの結合ビュー V があるとします。
B は非常に複雑な集計クエリを DS2 データベースにプッシュダウンし、A は DS1 に対して比較的単純なクエリを実行します。
B は複雑な集計クエリを DS2 にプッシュダウンしているので、DS2 はクエリを実行してから 30 秒 (データベースが結果を計算するために必要な時間) が経過してから、結果を返し始めるとします。最初の結果を返した後は、非常に速く結果を返します。なぜなら、データベースは Virtual DataPort サーバーと同じネットワークに存在するからです。
次に、DS1 はほぼ同時に結果を返し始めます (DS1 に対して実行するクエリは単純なため) が、外部ネットワークから発信するので、比較的遅いペースで着信します。
このような状況では、[Maximum size in memory of intermediate results] の値を増やすと、実行時間が速くなります。DS2 がクエリの計算に忙しい 30 秒の間に、Denodo は増やしたスペースを使用して (まだ必要ではなくても) DS1 からの結果を取得できるので、DS2 からのデータがようやく着信したときにはすでに使用できる状態になっています。この場合、[Maximum size in memory of intermediate results] パラメータの値が小さければ、使用可能なスペースはすぐに満杯になり、Denodo は最初の 30 秒間のほとんどを、DS2 を待機するだけで、何も作業せずに過ごします。