Cognos Analytics で逆スタースキーマモデルの実践 - ④パフォーマンスチューニング


概要

前回までのところで、属性データの逆スタースキーマへの取り込みをご説明しました。

③属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b

最終回の今回は、このモデルでできる数少ないチューニング方法です。

生成されるSQLの形

逆スタースキーマモデルで、2つのファクト表からデータアイテムを取得した場合、以下の様なパターンのSQLとして発行されます。
FS1で、ファクト1のSALESと、共通ディメンションのPRODを取得し、
FS2で、ファクト2のPLANと、共通ディメンションのPRODを取得し、
それをFULL OUTER JOINで結合します。
こういうクエリーをStitch Queryと言い、マルチファクトモデルではこの様なクエリーが発行されます。

WITH 
"FS1" AS 
    (
    SELECT
        "DIMC1"."PROD" AS "PROD", 
        SUM("FACTC1"."SALES") AS "SALES"
    FROM
        "DB2INST1"."DIMC1" "DIMC1"
            INNER JOIN "DB2INST1"."FACTC1" "FACTC1"
            ON "DIMC1"."PROD" = "FACTC1"."PROD" 
    GROUP BY 
        "DIMC1"."PROD"
    ), 
"FS2" AS 
    (
    SELECT
        "DIMC1"."PROD" AS "PROD", 
        SUM("FACTC2"."PLAN") AS "PLAN"
    FROM
        "DB2INST1"."DIMC1" "DIMC1"
            INNER JOIN "DB2INST1"."FACTC2" "FACTC2"
            ON "DIMC1"."PROD" = "FACTC2"."PROD" 
    GROUP BY 
        "DIMC1"."PROD"
    )
SELECT
    COALESCE(
        "FS1"."PROD", 
        "FS2"."PROD") AS "PROD", 
    "FS1"."SALES" AS "SALES", 
    "FS2"."PLAN" AS "PLAN"
FROM
    "FS1"
        FULL OUTER JOIN "FS2"
        ON "FS1"."PROD" = "FS2"."PROD" OR ("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL) FOR FETCH ONLY

FULL OUTER JOINじゃあ遅いのはしょうがないかなと感じてしまいますが、なんとかチューニングできないかと調査したところ、実は結合条件に記載されているこの部分があると非常に遅いことがわかりました。
("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL)

キー項目のデータが、どちらもNULLの場合に結合するかどうか、という条件になります。
この部分を外したクエリーを投げると、元々300秒くらいかかっていたクエリーが、10秒以下で返ってくるようになりました。

チューニング

何しろ自由分析なので、クエリーを書き換えるわけには行かず、この ("FS1"."PROD" IS NULL AND "FS2"."PROD" IS NULL) を消すためにはどうしたら良いか、という問題ですが、Framework Managerのガバナーの設定で解決できました。
ガバナーで「複数ファクトの結合演算子」を「等価演算子」に変更し、パッケージを発行したところ、例のNULL&NULL結合の箇所がきれいに消えてくれて、レポート実行時間が1/30くらいになりました。
これにより大量のファクトテーブルをまたがる自由分析という厳しい要件が、まっとうな速度で実現できるようになりました。
※NULL&NULL結合を消してよいかはもちろんデータの要件によります

終わりに

という訳で、全4回にわたる逆スタースキーマモデルの実践は終わりになります。
正直、最初に手をつけた時は「こんなモデルは無理できないだろうな」と思っていたのですが、Cognosの色々な機能を駆使して最終的に実現できてしまったとき、素直にCognosってすごいもんだなと感心してしまいました。
手軽で操作が簡易なセルフサービスBIの製品も良いですが、やっぱり長年エンタープライズでもまれてきた製品は底力があるもんですね。
今回やってみて感じた、この感動を一人でも多くの人に共有できたらと思い、4回にも渡って投稿してみました。

目次

第①回:基本的なモデルの動作検証
https://qiita.com/shinyama/items/0567425a4a47ad7d6efa

第②回:自由分析への対応
https://qiita.com/shinyama/items/5bb75bae2e67d6e9cac0

第③回:属性データのモデル取り込み
https://qiita.com/shinyama/items/b66d59a92a58533f7c2b

第④回:パフォーマンス・チューニング
https://qiita.com/shinyama/items/b4b28844b4235db70032