データ移動¶
データ移動の最適化によって、フェデレーテッドクエリを効率的に実行する手段が得られます。クエリで指定した 2 つのビューの一方が他方よりはるかに大きい場合、Virtual DataPort では、小さいビューのデータを大きいビューのデータソースに転送して、そこで操作を実行できます。これにより、パフォーマンスの大幅な向上を図ることができます。
この最適化によって、以下の操作のパフォーマンスが向上します。
結合
和結合
差結合
積結合
以下の例を考えます。
100 万行を収めたデータソース DS1 にビュー product があり、このビューに属性 category があるとします。カテゴリ「electronics」には 1,000 点の製品が属しています。
10 億行を収めたデータソース DS2 にビュー sale があり、このビューには、特定のセールで販売した製品であることを示す属性 product_id があります。したがって、製品ごとの平均売上件数は 1,000 です。
以下のクエリは、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 」を参照)。
DS1
に対してSELECT id FROM product WHERE p.category = 'electronics'
のようなクエリを Denodo から実行します。このクエリから 1,000 行が返されます。
手順 1 で取得した 1,000 個の
product_ids
を、グループあたり 200 個の ID を持つ 5 つのグループに分類します。これらのグループごとに、SELECT s.amount FROM Sale WHERE product_id IN (id1,...,id200)
のようなクエリを DS2 に実行します。手順 2 で 100 万行 (グループあたり 20 万行) が生成され、 DS2 から Denodo に転送されます。
手順 3 で取得した 100 万行を Denodo で後処理して合計金額を取得します。

データ移動: ネスト結合操作¶
データ移動の最適化を使用すると、以下の代替手順が可能になります (「 Data movement: join optimized with Data movement 」を参照)。
条件
c.category = 'electronics'
を指定して Denodo から product ビューにクエリを実行します。このクエリから 1,000 行が返されます。手順 1 で取得した 1,000 行を DS2 のテーブル (
TEMP_PROD
) に挿入します。これで、クエリ全体を DS2 に委任して、最終的な結果が得られます。この結果は 1 行で構成されます。
SELECT SUM(s.amount) FROM tempProduct p JOIN Sale s ON p.id = s.product_id WHERE p.category = 'electronics'

データ移動: データ移動によって最適化した結合¶
データ移動のターゲットにできるデータソースは以下のどちらかです。
ビューの実行に関与し、そのデータベースアダプターがキャッシュエンジンでサポートされている JDBC データソース (そのようなデータソースのリストについては「 キャッシュモジュール 」を参照)
キャッシュエンジンで使用されるデータベース (
vdpcachedatasource
またはcustomvdpcachedatasource
)
この条件により、Virtual DataPort で列の型に対する適切なマッピングを保持し、テーブルを正しく作成してそこにデータを挿入する方法を認識できるようになります。
さらに、データソースの構成には、そのデータソースにテーブルを作成するうえで必要なすべての情報を設定しておく必要があります。これは、コネクション URI にデータベース名を記述する必要があるということです。
データ移動を使用してビューを作成するには、以下の権限が必要です。
移動するすべてのビューに対する読み取り権限。これは、
CONTEXT
句のDATAMOVEMENTPLAN
プロパティで指定する権限です。ターゲットデータソースに対する実行権限。
ビューのデータ移動の実行¶
ビューのデータ移動は、ビューの [Options] ダイアログの [Data movement] タブで定義します。

ビューのデータ移動の定義¶
「 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
から上記のテーブルが削除されます。
ビューのデータ移動を有効にするには、[Force data movement] チェックボックスをチェックし、その下のボックスで、テーブルの作成場所とするデータベースを表すデータソースを選択します。
データ移動を制御する CONTEXT 句のオプション¶
クエリの CONTEXT
句には、データ移動を制御する以下の 3 つの句があります。
data_movement_bulk_load
: このプロパティがoff
になっていて、このクエリで実行エンジンによってデータ移動が実行される場合、実行エンジンではターゲットデータベースの一括ロード API が使用されません。代わりに、INSERT ステートメントによってデータが挿入されます。デフォルト値:
on
。データソースの一括ロード API を使用するようにターゲットソースを構成している場合、実行エンジンではデフォルトでその API が使用されます。data_movement_clean_resources
:true
の場合、データ移動が完了すると、データ移動を実行するために生成された一時テーブルが実行エンジンによって削除されます。データ移動でデータベースの一括ロード API が使用されていた場合、この操作を実行するために生成された区切り形式ファイルが削除されます。false
の場合、一時ファイルもこれらの区切り形式ファイルも削除されません。デフォルト値:
true
。データ移動の際に生成されたファイルには、挿入するすべてのデータが保存されています。したがって、クエリで移動するデータが数百万行に及び、(Denodo Scheduler のジョブなどによって) その移動を頻繁に実行する場合は、このプロパティを
false
に設定することは推奨されません。これらのファイルによって大量の領域が占有されるので、クエリを実行するたびに生成されるファイルによってハードドライブの空き容量が不足することがあります。data_movement_clean_resources_on_error
:false
の場合、データ移動が失敗すると、データ移動を実行するために生成された一時テーブルは実行エンジンによって削除されません。データ移動でデータベースの一括ロード API が使用されていた場合、この操作を実行するために生成された区切り形式ファイルは削除されません。データ移動が成功すると、これらのファイルと一時テーブルは実行エンジンによって削除されます。デフォルト値:
true
。このデフォルト値の場合、data_movement_clean_resources
プロパティをfalse
に設定している場合を除き、ステートメントが失敗したかどうかに関係なく、これらのファイルと一時テーブルは実行エンジンによって削除されます。Denodo Scheduler でデータ移動を指定したジョブをセットアップする場合、このオプションは問題のデバッグで効果的です。このオプションを使用すると、問題なく実行されたクエリのデータファイルを保持しなくても、失敗したジョブの問題をデバッグできます。
注釈
VirtualDataPort ではデータ移動に標準テーブルを使用します。
SQLServer へのデータ移動を行う場合、グローバル一時テーブルを使用できます。この機能を有効にするには、以下のコマンドを実行します。
SET 'com.denodo.vdb.util.tablemanagement.sql.SQLServerTableManager.useGlobalTemporaryTables' = 'true';
VDP を再起動する必要はありません。プロパティ値は、上記コマンドの実行後すぐに有効になります。
データ移動テーブル作成コマンドのカスタマイズ¶
Denodo では、データ移動テーブルの作成に組み込みの SQL 文を使用します。これらのテーブルの作成に使用するコマンドをカスタマイズできます。データ移動先のデータソースを編集して、データ移動用のカスタムテーブル作成テンプレートを設定する必要があります。

データソース: データ移動用のテーブル作成テンプレートを構成します。¶
ALTER DATASOURCE JDBC my_data_source
CREATE_TABLE_TEMPLATES (
my_data_movements_template = '<my template definition>'
)
DEFAULT CREATE_TABLE_TEMPLATES (DATA_MOVEMENT = my_data_movements_template);
警告
テーブル作成テンプレートを編集する前に、 ALTER DATASOURCE コマンドを使用してテーブル作成テンプレートを変更する場合の規則 をお読みください。
詳細については、「 キャッシュテーブル作成テンプレート 」のセクションを参照してください。