結合ビューよりも下位への GROUP BY ビューのプッシュダウン

結合ビューに対して GROUP BY を実行する場合、以下の各条件が成立すると、Denodo では、結合ビューよりも下位に GROUP BY をプッシュダウンできます。

  1. 結合の各分岐のデータがそれぞれ異なるデータソースから取得されること。

  2. 結合する 2 つのビューの間にアソシエーションが確立されていること。このアソシエーションは参照制約とする必要があります。また、アソシエーションの条件マッピングが、一方のビューのプライマリキーフィールドと他方のビューの外部キーフィールドとの「等号条件」であることが必要です。

これらの条件が成立しているとして、以下のクエリを考えます。

SELECT p.id, p.name, s.date, SUM(amount)
FROM
    product AS p
INNER JOIN
    sale AS s
ON (p.id = s.product_id)
GROUP BY p.id, p.name, s.date

このクエリは以下のように変換されます。

SELECT p.id, p.name, sg.date
FROM
(
    SELECT s.product_id, s.date, SUM(amount) amount
    FROM sale AS s
    GROUP BY s.product_id, s.date) sg
INNER JOIN
    product AS p
ON (p.id = sg.product_id)
)

GROUP BY が結合よりも下位にプッシュダウンされていることがわかります。これにより、GROUP BY 操作をデータベースにプッシュダウンできます。この変換によって、通常は、Denodo で sales ビューから取得する必要がある行の数が大幅に減少します。

この変換を適用できるようにするには、以下の構成によって sale ビューと product ビューの間でアソシエーションを作成しておく必要があります。

  • sale.product_id フィールドを product.product_id フィールドにマッピングします。

  • アソシエーションを「参照制約」として、これらのビューのプライマリキーと外部キーとの間に関係が存在することを示します。

  • エンドポイント product を「プリンシパル側」とします (エンドポイント sales を「依存側」にします)。

  • エンドポイント sale の多重度を * に設定します。これは、製品ごとに、その製品の product_id を持つ行が sale ビューに 0 行以上存在することを意味します。

この変換は、きわめて大規模なファクトテーブルを比較的小型のディメンションテーブルと結合することが普通のビジネスインテリジェンスシナリオ向けにカスタマイズされています。

重要

Virtual DataPort ではデータの参照整合性が適用されません。つまり、依存側ビューの各行に一致する行がアソシエーションのプリンシパル側ビューに存在しなければならないというルールが適用されません。この整合性はデータソースで確保する必要があり、アソシエーションの正しい定義はユーザーが確保する必要があります。

アソシエーションの定義に誤りがあると、ここで説明している最適化が、本来適用すべきではない状況で適用される可能性があります。