結合ビューよりも下位への GROUP BY ビューのプッシュダウン¶
結合ビューに対して GROUP BY を実行する場合、以下の各条件が成立すると、Denodo では、結合ビューよりも下位に GROUP BY をプッシュダウンできます。
結合の各分岐のデータがそれぞれ異なるデータソースから取得されること。
結合する 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 ではデータの参照整合性が適用されません。つまり、依存側ビューの各行に一致する行がアソシエーションのプリンシパル側ビューに存在しなければならないというルールが適用されません。この整合性はデータソースで確保する必要があり、アソシエーションの正しい定義はユーザーが確保する必要があります。
アソシエーションの定義に誤りがあると、ここで説明している最適化が、本来適用すべきではない状況で適用される可能性があります。