概要
これまで、あまり設定として意識していなかった、Cognos Framework Managerの、クエリーサブジェクトのSQL設定のオプションで、以下の赤枠の「SQLを生成」で「最小化」と「ビューとして」の意味を調べる機会がありましたので、自分への備忘録の意味も込めて投稿します。
それぞれの設定の意味
当然ながらここの設定を変更すると、レポート実行時に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が発行されていたものが、
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しています。
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
結果セットはどちらも変わらないですが、パフォーマンス面では違いがあります。
「最小化」が有利な条件はこんなパターンで、結合するデータがきっちりマッチする場合で、こういう場合に大量の行が処理対象となると、「最小化」は威力を発揮するようです。
しかしながら、下のような感じに結合キーがしっかり一致しない場合、結果セットに追加の行がどんどん増えてしまうそうです。
「ビューとして」に設定すると、この追加行が増える状態は防げるようです。
「最小化」の場合とで、レポート上の表示に違いが出てはいけないので、これらの行はSQLの結果セットとして一旦取得してきてしまって、その後Cognos上で削除されるのだとは思いますが、一旦取ってきてしまう時点で、パフォーマンス上はマイナスになるのかなと思います。
より多くの表を結合する程に、この状態になりやすいと思いますので、そういう大量の表を結合する環境では「ビューとして」の使用も検討してみても良いかも知れません。
「最小化」に設定してても、「ビューとして」と扱われてしまうパターン
ここら辺の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
まず言われているのが、「モデルのクエリー・サブジェクト」間でリレーションを貼ってしまっている場合です。
クエリーサブジェクトを作成する時の、こちらで「モデル」を選択している場合ですね。
CognosのGreat Outdoor Salesサンプルで言うところの、「ビジネスビュー」でリレーションを貼ってはいけませんという事です。リレーションはあくまで「データベースビュー」で貼るのが基本と教わったかと思いますが、これも理由の一つですね。
他に言及されているのが、
- filters, calculations, parameterized SQL, are added to Data Source Query Subjects
- SQL in a Data Source Query Subject is altered
なのでデータベースビューの、データ・ソースのクエリーサブジェクトで、フィルターや計算式、SQLの書き換えなどを行った際に、「ビューとして」の動きに強制的になってしまうようです。
これをやっている環境って結構あるように思いますので、パフォーマンスが出なくてモデルを見直す時に、「データベースビュー」で、何かしら不要なカスタマイズを入れてしまっていないか、見直すのも有効な手段になりそうです。