Cognos Framework Manager でデータソースが異なる表同士を結合する場合のチューニング


Framework Managerのフィルター・タイプ設定

こんなTechnoteの存在を最近始めて気が付き、自分の興味と理解のために検証したので、自分で忘れないように投稿しておきます。
こちらのFilter Join Optimizationです。

IBM Analytics Proven Practices - What's New in Framework Manager 10.2.2
http://www-01.ibm.com/support/docview.wss?uid=swg21902184

異なるデータベース上の二つの表を結合する時に、この設定が役立ちます。

例えば、以下のモデルで、TESTデータベースのSLS_ORDER_METHOD_DIM表とGS_DBデータベースのSLS_SALES_FACT表をORDER_METHOD_KEYをキーにしてリレーションを貼り、OrderMethodSalesクエリーサブジェクトで、SLS_ORDER_METHOD_DIM表のORDER_METHOD_JAとSLS_SALES_FACT表のQUANTITYを組み合わせて参照したいケースです。

OrderMethodsSalesクエリーサブジェクトを、そのままレポートのリストに置いて、ORDER_METHOD_JA='電子メール'でフィルターを掛けてレポートを実行します。

この時、SLS_SALES_FACT表に発行されるクエリーは以下になりました。
つまり、ORDER_METHOD_KEYが'電子メール'のデータのみをSLS_SALES_FACT表から取得して欲しいのに、全件取得しています。
全件取得後に、CognosのJVM上でSLS_ORDER_METHOD_DIMの結果(電子メールのみ)とマージして、最終結果セットを生成する動きです。
ファクト表から全件取得してしまうこの動きは、パフォーマンス上望ましく無いのは明白ですね。

SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
FOR FETCH ONLY

次に、Framework Manager上でリレーションのプロパティで、「(DQM)フィルター・タイプ」=「時刻」にしてみます。
※マニュアル上では、「中」の選択肢と記載されているのですが、実際は「時刻」という表示になります。SQL的には、IN句の指定をする、という意味がこの設定です。
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_fm.doc/t_dqm_join_opt.html

この時、SLS_SALES_FACT表に発行されるクエリーは以下になりました。
IN句で ORDER_METHOD_KEY IN (604)していますので、必要なデータのみをファクト表から取得してくれているのがわかります。

SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
WHERE 
"SLS_SALES_FACT"."ORDER_METHOD_KEY" 
IN ( 604 ) FOR FETCH ONLY

フィルター・タイプを「指定の値の間」にした場合、以下のクエリーが発行されます。
Betweenが使用されていますね。

SELECT 
"SLS_SALES_FACT"."ORDER_METHOD_KEY", "SLS_SALES_FACT"."QUANTITY" 
FROM 
"GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT" 
WHERE 
"SLS_SALES_FACT"."ORDER_METHOD_KEY" 
BETWEEN 604 AND 604 FOR FETCH ONLY

異なるデータベース上の表を結合する時に、ファクト表から必要なデータのみを取得するようにチューニングが必要と覚えておきましょう。