0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

概要

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

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

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

その場合、以下のようなクエリーが発行されますが、このクエリーがデータベース上でとっても遅いです。
フィルター、つまり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

改善レポート

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

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

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

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

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

しかしながらクエリーは、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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?