Cognos レポートでデータアイテムを連結(Concatinate)してフィルターすると遅い


概要

ディスってるようなタイトルになってしまいましたが、こういうレポートを作っている場合は、こういう対応をして下さい、という前向きな情報連携です。

データアイテム連結とは、例えばこんなレポートです。
Cognosサンプルの「製品ライン名称」と「製品ラインコード」を、連結して表示しています。

このレポートで詳細フィルターを置き、連結された「製品ライン名称_コード」に対してフィルターしています。

その場合、以下のようなクエリーが発行されますが、このクエリーがデータベース上でとっても遅いです。
フィルター、つまりwhere句で、データアイテム連結した結果にパラメーターの値で絞り込んでいるところが遅いポイントです。

SELECT
    "Product"."製品ライン" || '_' || "Product"."製品ライン_コード" AS "製品ライン名称_コード", 
    SUM("SLS_SALES_FACT"."QUANTITY") AS "数量"
FROM
    (
    SELECT
        "SLS_PRODUCT_DIM"."PRODUCT_LINE_CODE" AS "製品ライン_コード", 
        "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_JA" AS "製品ライン", 
        "SLS_PRODUCT_DIM"."PRODUCT_KEY" AS "製品キー"
    FROM
        "GOSALESDW"."SLS_PRODUCT_BRAND_LOOKUP" "SLS_PRODUCT_BRAND_LOOKUP"
            INNER JOIN "GOSALESDW"."SLS_PRODUCT_DIM" "SLS_PRODUCT_DIM"
            ON "SLS_PRODUCT_BRAND_LOOKUP"."PRODUCT_BRAND_CODE" = "SLS_PRODUCT_DIM"."PRODUCT_BRAND_CODE"
                INNER JOIN "GOSALESDW"."SLS_PRODUCT_COLOR_LOOKUP" "SLS_PRODUCT_COLOR_LOOKUP"
                ON "SLS_PRODUCT_DIM"."PRODUCT_COLOR_CODE" = "SLS_PRODUCT_COLOR_LOOKUP"."PRODUCT_COLOR_CODE"
                    INNER JOIN "GOSALESDW"."SLS_PRODUCT_LINE_LOOKUP" "SLS_PRODUCT_LINE_LOOKUP"
                    ON "SLS_PRODUCT_DIM"."PRODUCT_LINE_CODE" = "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_CODE"
                        INNER JOIN 
                        (
                        SELECT
                            "SLS_PRODUCT_LOOKUP"."PRODUCT_NUMBER" AS "PRODUCT_NUMBER"
                        FROM
                            "GOSALESDW"."SLS_PRODUCT_LOOKUP" "SLS_PRODUCT_LOOKUP" 
                        WHERE 
                            "SLS_PRODUCT_LOOKUP"."PRODUCT_LANGUAGE" = 'JA'
                        ) "SLS_PRODUCT_LOOKUP0"
                        ON "SLS_PRODUCT_DIM"."PRODUCT_NUMBER" = "SLS_PRODUCT_LOOKUP0"."PRODUCT_NUMBER"
                            INNER JOIN "GOSALESDW"."SLS_PRODUCT_SIZE_LOOKUP" "SLS_PRODUCT_SIZE_LOOKUP"
                            ON "SLS_PRODUCT_DIM"."PRODUCT_SIZE_CODE" = "SLS_PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_CODE"
                                INNER JOIN "GOSALESDW"."SLS_PRODUCT_TYPE_LOOKUP" "SLS_PRODUCT_TYPE_LOOKUP"
                                ON "SLS_PRODUCT_DIM"."PRODUCT_TYPE_CODE" = "SLS_PRODUCT_TYPE_LOOKUP"."PRODUCT_TYPE_CODE"
    ) "Product"
        INNER JOIN "GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT"
        ON "Product"."製品キー" = "SLS_SALES_FACT"."PRODUCT_KEY" 
WHERE 
    "Product"."製品ライン" || '_' || "Product"."製品ライン_コード" IN ( 
        :pPLC: ) 
GROUP BY 
    "Product"."製品ライン" || '_' || "Product"."製品ライン_コード" FOR FETCH ONLY

改善レポート

この改善策ですが、ユーザーはあくまで「製品ライン名称コード」でレポートを見たいので、
プロンプトページを作成し、値のプロンプトで、値の表示には「製品ライン名称
コード」を置き、使用する値に「製品ラインコード」を指定します。

プロンプトのクエリーはこんな感じです。

リストのクエリーのフィルターは、「製品ラインコード」に対してかけています。

レポートを実行すると、表示されるプロンプトは連結アイテムの表示で、ユーザーが求めているものです。

実行結果も連結アイテムで表示されます。

しかしながらクエリーは、where句が「製品ラインコード」をパラメーターで絞り込んでいるだけなので、これは高速にデータベースが結果を返してきます。

というチューニング例があるという事を頭の片隅で覚えて置いて頂き、データアイテム連結する時にパフォーマンスがよろしくない場合は、ちょっと思い出して頂けると幸いです。

SELECT
    "Product"."製品ライン" || '_' || "Product"."製品ライン_コード" AS "製品ライン名称_コード", 
    SUM("SLS_SALES_FACT"."QUANTITY") AS "数量"
FROM
    (
    SELECT
        "SLS_PRODUCT_DIM"."PRODUCT_LINE_CODE" AS "製品ライン_コード", 
        "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_JA" AS "製品ライン", 
        "SLS_PRODUCT_DIM"."PRODUCT_KEY" AS "製品キー"
    FROM
        "GOSALESDW"."SLS_PRODUCT_BRAND_LOOKUP" "SLS_PRODUCT_BRAND_LOOKUP"
            INNER JOIN "GOSALESDW"."SLS_PRODUCT_DIM" "SLS_PRODUCT_DIM"
            ON "SLS_PRODUCT_BRAND_LOOKUP"."PRODUCT_BRAND_CODE" = "SLS_PRODUCT_DIM"."PRODUCT_BRAND_CODE"
                INNER JOIN "GOSALESDW"."SLS_PRODUCT_COLOR_LOOKUP" "SLS_PRODUCT_COLOR_LOOKUP"
                ON "SLS_PRODUCT_DIM"."PRODUCT_COLOR_CODE" = "SLS_PRODUCT_COLOR_LOOKUP"."PRODUCT_COLOR_CODE"
                    INNER JOIN "GOSALESDW"."SLS_PRODUCT_LINE_LOOKUP" "SLS_PRODUCT_LINE_LOOKUP"
                    ON "SLS_PRODUCT_DIM"."PRODUCT_LINE_CODE" = "SLS_PRODUCT_LINE_LOOKUP"."PRODUCT_LINE_CODE"
                        INNER JOIN 
                        (
                        SELECT
                            "SLS_PRODUCT_LOOKUP"."PRODUCT_NUMBER" AS "PRODUCT_NUMBER"
                        FROM
                            "GOSALESDW"."SLS_PRODUCT_LOOKUP" "SLS_PRODUCT_LOOKUP" 
                        WHERE 
                            "SLS_PRODUCT_LOOKUP"."PRODUCT_LANGUAGE" = 'JA'
                        ) "SLS_PRODUCT_LOOKUP0"
                        ON "SLS_PRODUCT_DIM"."PRODUCT_NUMBER" = "SLS_PRODUCT_LOOKUP0"."PRODUCT_NUMBER"
                            INNER JOIN "GOSALESDW"."SLS_PRODUCT_SIZE_LOOKUP" "SLS_PRODUCT_SIZE_LOOKUP"
                            ON "SLS_PRODUCT_DIM"."PRODUCT_SIZE_CODE" = "SLS_PRODUCT_SIZE_LOOKUP"."PRODUCT_SIZE_CODE"
                                INNER JOIN "GOSALESDW"."SLS_PRODUCT_TYPE_LOOKUP" "SLS_PRODUCT_TYPE_LOOKUP"
                                ON "SLS_PRODUCT_DIM"."PRODUCT_TYPE_CODE" = "SLS_PRODUCT_TYPE_LOOKUP"."PRODUCT_TYPE_CODE"
    ) "Product"
        INNER JOIN "GOSALESDW"."SLS_SALES_FACT" "SLS_SALES_FACT"
        ON "Product"."製品キー" = "SLS_SALES_FACT"."PRODUCT_KEY" 
WHERE 
    "Product"."製品ライン_コード" IN ( 
        :pPC: ) 
GROUP BY 
    "Product"."製品ライン" || '_' || "Product"."製品ライン_コード" FOR FETCH ONLY