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

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

データアイテム連結とは、例えばこんなレポートです。
Cognosサンプルの「製品ライン名称」と「製品ラインコード」を、連結して表示しています。
![006.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/ed3ac6ab-939a-069c-5791-bd531181f945.jpeg)

このレポートで詳細フィルターを置き、連結された「製品ライン名称_コード」に対してフィルターしています。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/25423f59-2511-7353-9dd2-8fbb9ce94907.jpeg)

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

```html
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](https://qiita-image-store.s3.amazonaws.com/0/147246/9e3c7f5e-4c76-15da-de23-296a6f112a5f.jpeg)

プロンプトのクエリーはこんな感じです。
![004.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/acdbd12a-4319-512a-54e7-60562602a3cc.jpeg)

リストのクエリーのフィルターは、「製品ラインコード」に対してかけています。
![003.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/06404c15-31c6-6f7b-d65c-17c9c1c70008.jpeg)

レポートを実行すると、表示されるプロンプトは連結アイテムの表示で、ユーザーが求めているものです。
![007.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/cdc8c690-7307-6b7f-9440-4e6776cad8c6.jpeg)

実行結果も連結アイテムで表示されます。
![008.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0d1ed876-d5d4-9760-6eda-fba26cfcf9e0.jpeg)

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

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

```html
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
```