Cognos Framework ManagerのSQLを生成オプションの意味

##概要
これまで、あまり設定として意識していなかった、Cognos Framework Managerの、クエリーサブジェクトのSQL設定のオプションで、以下の赤枠の「SQLを生成」で「最小化」と「ビューとして」の意味を調べる機会がありましたので、自分への備忘録の意味も込めて投稿します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d1bdc6e3-588a-245d-a186-6538f5293654.png)

##それぞれの設定の意味
当然ながらここの設定を変更すると、レポート実行時にCognosからデータソースに発行されるSQLが変化します。
SQLの変化は、複数のテーブルを結合する場合に現れます。
※ちなみに「最小化」がデフォルトです。

マニュアルの記載を見ると、
**Changing how the SQL is generated**
https://www.ibm.com/support/knowledgecenter/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_fm.10.2.2.doc/t_change_sql_generation.html#change_sql_generation

「最小化」の場合、以下のようなSQLが発行されていたものが、

```html
select 
CONVERSIONRATE.COUNTRYCODE as COUNTRYCODE,
COUNTRY.EUROINUSESINCE as EUROINUSESINCE 
from
"2 - GOSales1 - OLE-DB".GOSALES1.dbo.CONVERSIONRATE CONVERSIONRATE,
"2 - GOSales1 - OLE-DB".GOSALES1.dbo.COUNTRY COUNTRY 
where
(COUNTRY.SALESCOUNTRYCODE = CONVERSIONRATE.COUNTRYCODE)
```

「ビューとして」にすると、以下のようなSQLになるそうです。
最小化で発行されていたSQLを（）で囲み、New_Query_Subjectとして、最終的にNew_Query_Subjectからselectしています。

```html
select 
New_Query_Subject.COUNTRYCODE as COUNTRYCODE,
New_Query_Subject.EUROINUSESINCE as EUROINUSESINCE
from
(select 
	CONVERSIONRATE.COUNTRYCODE as COUNTRYCODE,	COUNTRY.EUROINUSESINCE as EUROINUSESINCE
from
	"2 - GOSales1 - OLE-DB".GOSALES1.dbo.CONVERSIONRATE 	CONVERSIONRATE,
	"2 - GOSales1 - OLE-DB".GOSALES1.dbo.COUNTRY COUNTRY 
where
	(COUNTRY.SALESCOUNTRYCODE = CONVERSIONRATE.COUNTRYCODE)
	) New_Query_Subject 
```

結果セットはどちらも変わらないですが、パフォーマンス面では違いがあります。

「最小化」が有利な条件はこんなパターンで、結合するデータがきっちりマッチする場合で、こういう場合に大量の行が処理対象となると、「最小化」は威力を発揮するようです。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/98246d2b-f9f0-0e69-3a6b-ab33f5718b95.png)

しかしながら、下のような感じに結合キーがしっかり一致しない場合、結果セットに追加の行がどんどん増えてしまうそうです。
「ビューとして」に設定すると、この追加行が増える状態は防げるようです。
「最小化」の場合とで、レポート上の表示に違いが出てはいけないので、これらの行はSQLの結果セットとして一旦取得してきてしまって、その後Cognos上で削除されるのだとは思いますが、一旦取ってきてしまう時点で、パフォーマンス上はマイナスになるのかなと思います。
より多くの表を結合する程に、この状態になりやすいと思いますので、そういう大量の表を結合する環境では「ビューとして」の使用も検討してみても良いかも知れません。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7699c2ee-b716-8f1c-74c2-f1ff069597bb.png)


##「最小化」に設定してても、「ビューとして」と扱われてしまうパターン
ここら辺のTechnoteに、「最小化」に設定してても、「ビューとして」と扱われてしまう条件が載っています。

**What overrides the Minimized setting in the SQL Generation type for a Framework Manager model query subject**
http://www-01.ibm.com/support/docview.wss?uid=swg21993589

**SQL Not Minimized for Items in a Model Query Subject that is joined with another Query Subject**
http://www-01.ibm.com/support/docview.wss?uid=swg21342107

まず言われているのが、「モデルのクエリー・サブジェクト」間でリレーションを貼ってしまっている場合です。
クエリーサブジェクトを作成する時の、こちらで「モデル」を選択している場合ですね。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8b68fdc2-332e-dce5-cffd-f6881d322ffb.png)

CognosのGreat Outdoor Salesサンプルで言うところの、「ビジネスビュー」でリレーションを貼ってはいけませんという事です。リレーションはあくまで「データベースビュー」で貼るのが基本と教わったかと思いますが、これも理由の一つですね。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/db01b885-2674-3bdc-49db-b5f608d5748c.png)

他に言及されているのが、
- filters, calculations, parameterized SQL, are added to Data Source Query Subjects
- SQL in a Data Source Query Subject is altered
なのでデータベースビューの、データ・ソースのクエリーサブジェクトで、フィルターや計算式、SQLの書き換えなどを行った際に、「ビューとして」の動きに強制的になってしまうようです。

これをやっている環境って結構あるように思いますので、パフォーマンスが出なくてモデルを見直す時に、「データベースビュー」で、何かしら不要なカスタマイズを入れてしまっていないか、見直すのも有効な手段になりそうです。