データ移動

データ移動の最適化によって、フェデレーテッドクエリを効率的に実行する手段が得られます。クエリで指定した 2 つのビューの一方が他方よりはるかに大きい場合、Virtual DataPort では、小さいビューのデータを大きいビューのデータソースに転送して、そこで操作を実行できます。これにより、パフォーマンスの大幅な向上を図ることができます。

この最適化によって、以下の操作のパフォーマンスが向上します。

  • 結合

  • 和結合

  • 差結合

  • 積結合

以下の例を考えます。

100 万行を収めたデータソース DS1 にビュー product があり、このビューに属性 category があるとします。カテゴリ「electronics」には 1,000 点の製品が属しています。

10 億行を収めたデータソース DS2 にビュー sale があり、このビューには、特定のセールで販売した製品であることを示す属性 product_id があります。したがって、製品ごとの平均売上件数は 1,000 です。

image0

以下のクエリは、electronics 部門の製品の売上高を取得します。

SELECT SUM(s.amount)
FROM Product p JOIN Sale s ON p.id = s.product_id
WHERE p.category = 'electronics'

この結合方法として、通常はネスト結合を使用します。この場合、Denodo では自動的にネスト結合の最適化が使用されます。この最適化では、内部リレーション (sale) にクエリを実行する際に外部リレーション (product) のいくつかの ID がグループ化されます。具体的な実行手順は以下のとおりです (「 Data movement: nested join operation 」を参照)。

  1. DS1 に対して SELECT id FROM product WHERE p.category = 'electronics' のようなクエリを Denodo から実行します。

    このクエリから 1,000 行が返されます。

  2. 手順 1 で取得した 1,000 個の product_ids を、グループあたり 200 個の ID を持つ 5 つのグループに分類します。これらのグループごとに、 SELECT s.amount FROM Sale WHERE product_id IN (id1,...,id200) のようなクエリを DS2 に実行します。

  3. 手順 2 で 100 万行 (グループあたり 20 万行) が生成され、 DS2 から Denodo に転送されます。

  4. 手順 3 で取得した 100 万行を Denodo で後処理して合計金額を取得します。

Data movement: nested join operation

データ移動: ネスト結合操作

データ移動の最適化を使用すると、以下の代替手順が可能になります (「 Data movement: join optimized with Data movement 」を参照)。

  1. 条件 c.category = 'electronics' を指定して Denodo から product ビューにクエリを実行します。このクエリから 1,000 行が返されます。

  2. 手順 1 で取得した 1,000 行を DS2 のテーブル (TEMP_PROD) に挿入します。

  3. これで、クエリ全体を DS2 に委任して、最終的な結果が得られます。この結果は 1 行で構成されます。

    SELECT SUM(s.amount)
    FROM tempProduct p JOIN Sale s
    ON p.id = s.product_id
    WHERE p.category = 'electronics'
    
Data movement: join optimized with Data movement

データ移動: データ移動によって最適化した結合

データ移動のターゲットにできるデータソースは以下のどちらかです。

  • ビューの実行に関与し、そのデータベースアダプターがキャッシュエンジンでサポートされている JDBC データソース (そのようなデータソースのリストについては「 キャッシュモジュール 」を参照)

  • キャッシュエンジンで使用されるデータベース ( vdpcachedatasource または customvdpcachedatasource )

この条件により、Virtual DataPort で列の型に対する適切なマッピングを保持し、テーブルを正しく作成してそこにデータを挿入する方法を認識できるようになります。

さらに、データソースの構成には、そのデータソースにテーブルを作成するうえで必要なすべての情報を設定しておく必要があります。これは、コネクション URI にデータベース名を記述する必要があるということです。

データ移動を使用してビューを作成するには、以下の権限が必要です。

  • 移動するすべてのビューに対する読み取り権限。これは、 CONTEXT 句の DATAMOVEMENTPLAN プロパティで指定する権限です。

  • ターゲットデータソースに対する実行権限。

注釈

現在、 Design Studio では [Execution plan] タブを使用できませんが、今後の更新で現在のオプションを拡張して段階的に追加する予定です。それまでは、ビューに対してデータ移動を指定するには、Virtual DataPort の管理ツールを使用する必要があります。

ビューのデータ移動は、ビューの [Options] ダイアログの [Execution plan] タブで定義します。

Defining the data movement of a view

ビューのデータ移動の定義

Defining the data movement of a view 」では、 full_order_info ビューにデータ移動を 2 つ定義しています。このビューにクエリを実行すると、実行エンジンによって ds_jdbc_vertica ソースのデータベースにテーブルが 2 つ作成されます。つづいて、 employee ビューのデータが取得されて、 ds_jdbc_vertica にある 2 つのテーブルの一方にそのデータが挿入されます。また、 product ビューのデータが取得されて、それが他方のテーブルに挿入されます。これで、実行エンジンによって 2 つの結合を ds_jdbc_vertica に委任できるようになります。

このクエリが完了すると、 ds_jdbc_vertica から上記のテーブルが削除されます。

ビューのデータ移動を有効にするには、[Enable data movement] チェックボックスをチェックし、その下のボックスで、テーブルの作成場所とするデータベースを表すデータソースを選択します。

データ移動を制御する CONTEXT 句のオプション

クエリの CONTEXT 句には、データ移動を制御する以下の 3 つの句があります。

  1. data_movement_bulk_load: このプロパティが off になっていて、このクエリで実行エンジンによってデータ移動が実行される場合、実行エンジンではターゲットデータベースの一括ロード API が使用されません。代わりに、INSERT ステートメントによってデータが挿入されます。

    デフォルト値: on 。データソースの一括ロード API を使用するようにターゲットソースを構成している場合、実行エンジンではデフォルトでその API が使用されます。

  2. data_movement_clean_resources: true の場合、データ移動が完了すると、データ移動を実行するために生成された一時テーブルが実行エンジンによって削除されます。データ移動でデータベースの一括ロード API が使用されていた場合、この操作を実行するために生成された区切り形式ファイルが削除されます。 false の場合、一時ファイルもこれらの区切り形式ファイルも削除されません。

    デフォルト値: true

    データ移動の際に生成されたファイルには、挿入するすべてのデータが保存されています。したがって、クエリで移動するデータが数百万行に及び、(Denodo Scheduler のジョブなどによって) その移動を頻繁に実行する場合は、このプロパティを false に設定することは推奨されません。これらのファイルによって大量の領域が占有されるので、クエリを実行するたびに生成されるファイルによってハードドライブの空き容量が不足することがあります。

  3. data_movement_clean_resources_on_error: false の場合、データ移動が失敗すると、データ移動を実行するために生成された一時テーブルは実行エンジンによって削除されません。データ移動でデータベースの一括ロード API が使用されていた場合、この操作を実行するために生成された区切り形式ファイルは削除されません。データ移動が成功すると、これらのファイルと一時テーブルは実行エンジンによって削除されます。

    デフォルト値: true 。このデフォルト値の場合、 data_movement_clean_resources プロパティを false に設定している場合を除き、ステートメントが失敗したかどうかに関係なく、これらのファイルと一時テーブルは実行エンジンによって削除されます。

    Denodo Scheduler でデータ移動を指定したジョブをセットアップする場合、このオプションは問題のデバッグで効果的です。このオプションを使用すると、問題なく実行されたクエリのデータファイルを保持しなくても、失敗したジョブの問題をデバッグできます。