USER MANUALS

ウィンドウ関数

ウィンドウ関数 (分析関数とも呼ばれる) は、指定した行の結果をその行のウィンドウフレームから派生させる関数です。ウィンドウ関数は集計関数と類似しており、いずれも行のグループに基づいて集計値を計算します。集計関数は行のグループごとに 1 つの値を返すのに対し、ウィンドウ関数はグループごとに複数の行を返す点が異なります。関数の一覧とその説明については、「 ウィンドウ関数 」を参照してください。

重要

Virtual DataPort では、ウィンドウ関数をデータソースにプッシュダウンして委任を試みます。これができない場合、Denodo では、必要なデータを並列処理システムやキャッシュに転送することにより、外部システムでウィンドウ関数を実行できます。これらのオプションが有効でない場合、Denodo はクエリの実行を中止します。

ウィンドウ関数の実行

ウィンドウ関数をクエリデータソースにプッシュできない場合、クエリオプティマイザーでは、以下の最適化を適用する組み込み MPP、キャッシュ、または外部システムの実行機能を使用できます。

  • 組み込み MPP の高速化 。データは Denodo 組み込み MPP クラスタにストリーミングされます。

  • 外部 MPP による並列処理 。データは外部の MPP に転送されます。このオプションは、外部の MPP と Virtual DataPort サーバー間の遅延が低い場合のみ推奨されます。

  • データ移動 。データは、セッション用に構成されたクエリデータソースまたはキャッシュデータベースのいずれかに転送されます。

以下のセクションでは、ウィンドウ関数の処理でデータを転送する 2 つの方法について説明します。

  • 自動: 「クエリの最適化 」で選択されたシステムに必要なデータを自動で移動するように、クエリオプティマイザーを構成できます。

  • 手動: この場合、ユーザーが目的のデータ移動を指定します。

自動データ移動によるウィンドウ関数の委任

オプティマイザーでは、ウィンドウ関数の実行に必要なすべてのデータをデータソースに転送するために、上記のいずれかの最適化を自動的に使用できます。この機能を有効にするには、以下の手順に従います。

  • 組み込みまたは外部で MPP が利用可能な場合、その MPP がオプティマイザーに対して利用できることを確認します。「クエリの最適化 」を参照してください。

  • ウィンドウ関数の実行でオプティマイザーが使用できる JDBC データソースについては、データソースの [Read&Write] セクションでデータ移動が許可されていることを確認し、利用可能であれば一括読み込みが構成されていることを確認します。

最適化の選択基準は、 コストベースの最適化 を使用してクエリを実行するかどうかで異なります。コストベースの最適化 を使用しない場合、MPP を伴う最適化のみを選択できます。コストベースの最適化 を使用する場合、上記のいずれかの最適化を選択できます。推定コストは、パフォーマンスへの影響を最小限に抑えるためにどのデータセットをデータソースに転送するかを判断する場合に役立ちます。

データ移動 を選択した場合、データのターゲットデータソースは、常にクエリの基礎となるいずれかのデータソースであり、自動によるデータ移動をサポートする必要があります。

クエリのセッションで使用されるデータベースのキャッシュも、ウィンドウ関数を実行する場合のみ、外部 MPP と同じ方法で使用できます。

警告

ウィンドウ関数はリソースを消費する操作です。このオプションの有効化を推奨するのは、キャッシュデータベースに並列処理エンジンがある場合のみです。

手動データ移動によるウィンドウ関数の委任

MPP を利用できず、 データ移動 を使用する条件が満たされない場合、ウィンドウ関数は実行できません。

これらのシナリオでは、手動による データ移動 の最適化を使用し、 CONTEXT 句のパラメータ DATAMOVEMENTPLAN を指定して、ウィンドウ関数をサポートするデータソースにデータを転送します。

SELECT region.r_name, nation.n_name, sum(order.o_totalprice), rank() OVER (PARTITION BY region.r_name ORDER BY sum(order.o_totalprice) DESC)
FROM order INNER JOIN customer ON order.o_custkey = customer.c_custkey
INNER JOIN nation ON customer.c_nationkey = nation.n_nationkey
INNER JOIN region ON nation.n_regionkey = region.r_regionkey
WHERE region.r_regionkey > 0
GROUP BY region.r_name, nation.n_name
CONTEXT(DATAMOVEMENTPLAN =
    order : JDBC admin.vdpcachedatasource
    customer : JDBC admin.vdpcachedatasource
    nation : JDBC admin.vdpcachedatasource
    region : JDBC admin.vdpcachedatasource
);

この例では、 DATAMOVEMENTPLAN 句によって、クエリに関連するビューのデータをキャッシュデータベース (admin.vdpcachedatasource) に移動し、そこでウィンドウ関数を実行するように実行エンジンに指示しています。オプティマイザーでは、WHERE 条件と他の関数をソースデータベースに委任し、ソースとキャッシュデータベース間で転送する必要があるデータを削減します。この例では、データソースが条件 r_regionkey > 0 に対応する場合、 region のデータを取得するためにソースで実行される SQL クエリに、この条件が含まれます。

サードパーティ製ツール (ビジネスインテリジェンスツールなど) からクエリを実行しているために CONTEXT 句をクエリに追加できない場合は、データ移動を伴うビューを作成し (「 ビューのデータ移動の実行 」を参照)、新しいビューにクエリを実行します。

Add feedback