概要
インフォメーションリンク実行時にはデータベース内で一時テーブルを作成して使うことがあります。
1.DB間の結合
2.オンデマンドロード
この記事はインフォメーションリンクにおける一時テーブルの利用について情報を整理します。
動作検証環境
本資料はSpotfire 12.0LTS環境で動作検証して作成しておりますが、記事内容はSpotfire 10.10以降には共通です。
・Spotfire Server 12.0.5
・Spotfire Analyst 12.0.4
DB間の結合
異なるデータソース(それぞれがデータベースへ接続)間で結合を設定した場合にはインフォメーションリンク実行時に一時テーブルを作成して使います。
※それぞれのデータソースが同じデータベースを参照している場合でも結合時には一時テーブルを利用します。
以下のようにDB間の結合を構成したインフォメーションリンクを例に説明します。
・インフォメーションリンク(擬似コード):
SELECT
テーブル①.カラム,
テーブル②.カラム
FROM
DB①.テーブル①,
DB②.テーブル②
WHERE
DB①.テーブル①.キーカラム = DB②.テーブル②.キーカラム
上記のインフォメーションリンクを実行する際には以下のSQLが実行されます。
※結合用DBの設定によってSQLが異なりますので下記は一例です。
1.まずは片方のDBから全件データをSpotfire Serverまで取得します。
SELECT
テーブル①.カラム
FROM
DB①.テーブル①
2.次に、もう片方のDB(本例では結合用DBとして使用)内で一時テーブルを作成して、上記1.で取得したデータをすべて挿入します。
CREATE TEMPORARY TABLE SFTMP12345 (テーブル①のカラム一覧※省略)
INSERT INTO SFTMP12345 VALUES (テーブル①の値一覧※省略)
3.さらに、以下のSQLを実行して結合を実施し結果データをSpotfireへ取り込みます。
SELECT
SFTMP12345.カラム,
テーブル②.カラム
FROM
SFTMP12345,
DB②.テーブル②
WHERE
SFTMP12345.キーカラム = DB②.テーブル②.キーカラム
4.最後に、前述で作成した一時テーブルを削除します。
DROP TABLE SFTMP12345
そして、結合用DBが設定されていない場合にはDB間の結合は正しく実施できません。
該当インフォメーションを実行しようとする際には以下のエラー(No writable data source.)が発生し、処理が異常中止します。
Spotfire 11.7における仕様変更
Spotfire 11.7では仕様変更が導入されており、リポジトリDBが暗黙的にデフォルトの結合用DBとして使用される機能は完全に廃止されました。これによりSpotfire 11.7より前のバージョンでは結合用DBを明示的に設定しなくてもDB間の結合を正しく実施できていましたが、11.7からは結合用DBを明示的に設定しないとDB間の結合が実施できなくなりました。
※参考資料(TIBCO Spotfire® Server Release Notes Software Release 11.7.0)
TSS-28433 The functionality to use the Spotfire database to join data sources in Information Services (default join database) has been removed.
結合用DBの設定
結合用DBは以下のいずれかの方法で設定できます。
・方法1:デフォルトの結合用DBを指定する(事前に別途DB環境を準備する必要がある)
・方法2:インフォメーションリンクのデータソースとして設定済みの特定のデータソースを結合用DBとして指定する
方法1:デフォルトの結合用DBを指定する
事前に結合用DB環境を準備したうえで、Spotfire Server設定を変更してデフォルトの結合用DBを指定します。(参考資料)
※Spotfire Server端末内で実施してください。
1.以下のいずれかの方法で「TIBCO Spotfire Server Configuration Tool」を起動します。
・バッチファイル:C:\tibco\tss\12.0.5\tomcat\spotfire-bin\uiconfig.bat
・スタートメニュー:TIBCO Spotfire Server 12.0.5 LTS ⇒ Configure TIBCO Spotfire Server 12.0.5 LTS
※起動時にConfiguration Toolのパスワードが必要です。
2.「Configuration」タブにて「Join Database」画面を開いて、結合用DBを指定します。
・Enable default join database:Yesを選択
・Data source templates:対象DBに対応したデータソーステンプレートを選択
・Database URL:対象DBへの接続文字列を指定(余計なスペースがないように編集すること)
・Database username:DB認証ユーザー(該当ユーザーには一時テーブルの作成や読み書き権限が必要)
・Database password:DB認証ユーザーのパスワード
・Minimum connections:DBへのコネクションプールに保持する接続数の最小値
・Maximum connections:DBへの同時接続数の最大値
※接続数最小値と最大値両方ともに「0」を指定した場合はコネクションプールを使わずに必要に応じてDB接続を確立して使用し、使用後にはすぐに解放します(同時接続数上限なし)。
3.設定完了後に「Save configuration」ボタンを押して「Database」へ保存し、Spotfire Serverサービスを再起動してください。
方法2:インフォメーションリンクのデータソースとして設定済みの特定のデータソースを結合用DBとして指定する
インフォメーションデザイナー画面にて、特定のデータソース(結合を行うインフォメーションリンクが参照しているもの、またはライブラリ内にあるほかのもの)を編集して結合用DBとして使用できるように設定できます。
①「一時テーブルでの書き込みを許可する」(Allow writing in temporary tables)をチェック入れる
②「保存」ボタンを押してデータソースを保存る
※「ユーザー名」に指定されているDBユーザーには一時テーブルの作成や読み書き権限が必要です。
これでDB間結合を行う際には該当データソースが参照しているデータベースが結合用DBとして使用されます。
※実行対象インフォメーションリンクから参照されているどうかにかかわらず、あらゆるDB間で結合を行う際にも上記で設定したデータソースが結合用DBとして使用されることがあります。
優先順位
方法1と方法2の両方とも設定されている場合、または方法2で設定されているデータソースがSpotfire環境内で複数個存在している場合はデフォルト設定では以下のルールで結合用DBを選定します。
また、下記のルールで選定した結合用DBが正しく利用できない場合(例えばDBユーザーに一時テーブルの作成や読み書き権限が付与されていないなど)にはインフォメーションリンクの実行が異常で失敗します。
1.対象インフォメーションリンクの要素一覧にて、上から順番に各要素が参照しているデータソースのうち、方法2で設定されているものを探して結合用DBとして優先に使用します。
2.方法2で設定されているデータソースが存在しない場合、方法1で設定したデフォルトの結合用DBが優先に使用されます。
3.上記のいずれも存在しない場合、インフォメーションリンクが参照していないほかのすべてのデータソースのうち、方法2で設定されているものをデータソース名で昇順でソートし、先頭から利用できるものを探して使用します。
4.インフォメーションリンク編集画面で結合用DBを明示的に指定することができます。
ここで指定されている結合用DBが上記の1.~3.よりも最優先に使用されます。
下記の「データソースの結合」ドロップダウンリストから結合用DBを指定できます。
・既定値を使用:上記の1~3のルールに従って自動的に選定します。
・方法2で設定されているデータソース(存在している場合)の一覧から利用したいものを選択します。
さらに、既定の結合用DB選定ルール(上記の1.~3.の部分)は以下の手順て変更できます。
結合用DB選定ルールの変更手順
以下の手順に従ってSpotfire Server設定を変更して結合用DBの選定ルールを変更できます。
①Spotfire Server端末内でOS管理者権限でコマンドプロンプトを起動して、以下のインストール先フォルダへ移動します。C:\tibco\tss\12.0.5\tomcat\spotfire-bin
②以下のコマンドを実行して現行設定をエクスポートします。
config.bat export-config -f
※コマンド実行時にConfiguration Toolのパスワードが必要です。
※引数「-f」は既存設定ファイル(configuration.xml)を上書きすることを示します。
③以下のコマンドを実行して設定変更を実施します。
下記コマンドの例では方法1で指定したデフォルトの結合用DBを優先に使用するように指定します。
config.bat set-config-prop -n information-services.join-data-source-selection-rule -v DEFAULT_JOIN_DATA_SOURCE
※引数「-n」には設定項目名(本件:information-services.join-data-source-selection-rule)を指定します。
※引数「-v」には設定値を指定します。利用できる設定値は以下の3つです。
・FIRST_ELEMENT_TARGET(デフォルト):インフォメーションリンクの要素一覧にて、上から順番に各要素が参照しているデータソースのうち、方法2で設定されているものを探して結合用DBとして使用します。
・LAST_ELEMENT_TARGET:インフォメーションリンクの要素一覧にて、下から順番に各要素が参照しているデータソースのうち、方法2で設定されているものを探して結合用DBとして使用します。
・DEFAULT_JOIN_DATA_SOURCE:方法1で指定したデフォルトの結合用DBを優先に使用します。
FIRST_ELEMENT_TARGET(デフォルト)とLAST_ELEMENT_TARGETのそれぞれでの動作例:
④以下のコマンドを実行して上記で変更した設定をインポートします。
config.bat" import-config -c "use-default-joindb"
※引数「-c」には変更内容がわかるようにコメントを指定します。
⑤Spotfire Serverサービスを再起動して設定変更を反映させてください。
オンデマンドロード
インフォメーションリンクをオンデマンドロードで実行する際に、参照先データベース内で一時テーブルを作成することがあります。
通常は、オンデマンドロードで条件値を指定した場合には以下のようなSQLが発行されます。
SELECT
カラム一覧
FROM
テーブル
WHERE
カラム① IN (値①,値②,値③,…)
そして、条件値の数が多くて一定な閾値を超えた場合には上記の代わりに以下の流れで処理されます。
①参照先データベース内で一時テーブルを作成し、すべての条件値を挿入します。
CREATE TEMPORARY TABLE SFTMP12345 (カラム①)
INSERT INTO SFTMP12345 VALUES (すべての条件値)
②以下のSQL文を実行して結果データをDBから取得してSpotfireへ取り込みます。
SELECT
カラム一覧
FROM
テーブル,
SFTMP12345
WHERE
テーブル.カラム① = SFTMP12345.カラム①
③前述で作成した一時テーブルを削除します。
DROP TABLE SFTMP12345
注意事項
1.オンデマンドロードでの一時テーブルは必ず参照先のデータベース内で作成されます。結合データベースやほかのデータソースを使用することはありません。
2.インフォメーションリンクが参照しているデータソースのオプション「一時テーブルでの書き込みを許可する」の設定値(オン・オフ)と関係なく一時テーブルを作成します。
※Spotfire Server 12.2より、本件動きが変更されました。また、この変更は12.0.Xへ移植されていません。
v12.2以降の場合、インフォメーションリンクが参照しているデータソースのオプション「一時テーブルでの書き込みを許可する」の設定値がオンの場合のみ一時テーブルが作成されます。オフの場合は必要に応じてIN句をORで連結してSQL文(例:カラム IN (...)OR カラム IN(…)・・・)を生成して実行します。
TIBCO Spotfire® Server Release Notes Software Release 12.2.0
Closed Issues
TSS-13324 12.2.0 When you access on-demand data with an information link, temporary tables might be used for optimization when the number of filter values gets too large, even if you have not enabled writing to temporary tables for the data source.
3.インフォメーションリンクが参照しているデータソースに指定されているDBユーザーには一時テーブルの作成や読み書き権限が必要です。
4.一時テーブルを作成またはデータを挿入できなかった場合(DBユーザーに一時テーブルの作成や読み書き権限が付与されていないなど)にはオンデマンドロードが下記のようなエラーで失敗します。
5.一時テーブルの利用有無を制御する閾値はデータソーステンプレート内で指定されています。
下記はデータソーステンプレート「PostgreSQL」の例ですが、閾値は以下の設定項目で指定されています。条件値の数がこの数値を超えた場合には一時テーブルが利用されます。
必要に応じてデータソーステンプレートを編集して閾値を調整することができます。
<condition-list-threshold>10000</condition-list-threshold>
参考資料
https://support.tibco.com/s/article/Best-Practices-Information-Link-joins-between-different-sources
https://community.spotfire.com/s/article/changing-spotfire-is-default-join-database