ストリーミング演算子と非ストリーミング演算子¶
一般に、データソースへのアクセスは「ストリーミング」モードで行われます。これは、Denodo は、データソースから返される結果セット全体をメモリに読み込んでからその処理を開始するのではなく、必要に応じてデータソースからデータをブロック単位で取得することを意味します。データ変換および一部のタイプの結合操作 (結合、和結合、選択、投影など) の多くも「ストリーミング」モードで実行され、一度に少量の行のみ処理します。
ストリーミングモードでデータソースにアクセスして、そのデータを排他的ストリーミング演算子を使用して結合する場合、処理する行数に関係なく、クエリのメモリ消費量は最小になります。複数のデータソースの巨大なテーブル同士を結合して Denodo が数百万行を処理する場合でも、ストリーミング演算子を使用して結合を実行すると、最小限のメモリしか消費されません。
注釈
このルールにはさまざまな例外があり、ストリーミング演算子を使用しても大量のメモリを消費する可能性があります。これらの例外については、「 ストリーミング操作のエッジケース 」を参照してください。
ストリーミングモードで実行できないデータ変換/結合演算子がいくつか存在します。これらの非ストリーミング演算子が原因で、クエリが多数の行を処理する必要があるときに大量のメモリを消費する可能性があります。
以下に非ストリーミング演算子を示します。
ハッシュ結合: ハッシュ実行メソッドを使用し、結合の右辺のビューのすべての行をメモリに読み込む結合。そのビューに適切な選択条件が存在する場合、条件が適用されてから結合が実行されることに注意してください。ただし、条件が存在しない場合またはあまり選択的ではない場合は、依然として大量の行をメモリに読み込む必要がある可能性があります。
結合の左辺のビューはストリーミングモードでアクセスされるので、そのサイズによってメモリ消費量が大幅に増えることはありません。マージやネストなど、他の実行メソッドを使用する結合は、ストリーミングモードで実行できるので、大量のメモリを消費しません。
各結合実行メソッドの仕組みについては、「 結合操作の最適化 」を参照してください。
差結合 操作と 積結合 操作: これらの操作は、 ハッシュ結合 と同様の方法で Denodo によって実行されます。したがって、メモリに関して同じ検討事項が適用されます。
ハッシュメソッドを使用するクエリの WHERE 句のサブクエリ: これらのサブクエリは、内部演算子「準結合」を使用して実行されます。この演算子は、結合と同様に動作し、ハッシュ、マージ、およびネストの 3 つの実行メソッドを許容します。
サブクエリを実行するために使用したメソッドは、クエリの実行トレースで確認できます。
準結合の各メソッドの詳細およびその選択手順については、『VQL ガイド』の「 クエリの WHERE 句で使用するサブクエリ 」を参照してください。
Order By: 並べ替えは本質的に「非ストリーミング」操作です。なぜなら、出力の最初の行を生成する前に、すべてのデータを読み込む必要があるからです。並べ替えるデータが大量にある場合、この操作は大量のメモリを消費する可能性があります。
Group By: グループ化操作は、グループ化フィールドでデータを並べ替えるときにストリーミングモードで実行されます。この場合、特にクエリの
SELECT
句で「累積」集計関数 (つまりAVG
、COUNT
、SUM
、MAX
、またはMIN
) のみを使用する場合、通常はメモリ消費量は最小限です。それ以外の場合、Virtual DataPort は実行メソッドとして「ハッシュグループ化」を使用するので、大量のメモリを消費する可能性があります。SELECT DISTINCT: SELECT DISTINCT 操作は、 Group By 操作と非常によく似た方法で実行されます。したがって、 Group By 操作と同じ検討事項がこの操作にも適用されます。
これらの演算子を使用するクエリが占有するメモリを制限する手順については、「 クエリの最大メモリ使用量の制限 」を参照してください。
クエリが非ストリーミング演算子を使用する上、多数の行を処理する場合、メモリ設定の影響を受けます。次のセクションでは、メモリスワップ設定について説明します。これは、非ストリーミング操作が使用可能なメモリを使い果たすのを避けるために使用する設定です。