SPSS ModelerのDBキャッシュの動き

SPSS Modelerのキャッシュは処理の途中結果を保存しておく機能です。
SQLプッシュバックとデータベース・キャッシングの機能を有効にしておくと、SQLプッシュバックが有効な処理はデータベースの一時テーブルをつくって、そこに保存することができます。

#1. 設定
ストリームのオプション設定でSQL最適化とデータベース・キャッシングにチェックを入れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/127fb781-90ce-32fb-2b79-f72d964e1f27.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d9866655-1933-160d-ab09-d55d3d1e0b1c.png)

動きを確認するためにSQLをログに記録するオプションにもチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8def2ff3-6aa0-cf8e-2d00-2f7c27515577.png)

#2. DBキャッシュ
単純な条件抽出を行う処理を用意しました。これはSQLプッシュバックが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/78a1df41-68b5-dc7c-0a2b-d032f9d598e6.png)

このノードのキャッシュを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/38384e56-40f1-1a0e-cf4b-0ab107132a31.png)

実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e8b8ae41-b15e-c645-6a80-8e5a122b1d9a.png)

以下のようになります。キャッシュのアイコンがディスクの絵になって緑になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/14eacd45-cc87-538b-8596-4c4609ed1f6d.png)

①一時表が作られています。

```sql
[2021-03-05 17:27:07] SQL を実行中: DECLARE GLOBAL TEMPORARY TABLE "SESSION".CLEMTMP151212791 ( "M_CD" VARCHAR(10),"UP_TIME" INTEGER,POWER INTEGER,TEMP INTEGER,PRES INTEGER,"ERR_CD" VARCHAR(10) ) ON COMMIT PRESERVE ROWS NOT LOGGED
```
②WHERE条件を含むSQLプッシュバックした内容を一時表に書き出しています。


```sql
[2021-03-05 17:27:09] SQL をプレビュー中: INSERT INTO "SESSION".CLEMTMP151212791 ("M_CD","UP_TIME",POWER,TEMP,PRES,"ERR_CD") 
SELECT T0."M_CD" AS C0,T0."UP_TIME" AS C1,T0.POWER AS C2,T0.TEMP AS C3,T0.PRES AS C4,T0."ERR_CD" AS C5 
FROM HWV53816."COND2N_E" T0 
WHERE (T0."M_CD" = '1000')
```

③一時表から読みだしています。この時にWHERE条件はなくなっています。

```sql
[2021-03-05 17:27:09] SQL を実行中: SELECT T0."M_CD" AS C0,T0."UP_TIME" AS C1,T0.POWER AS C2,T0.TEMP AS C3,T0.PRES AS C4,T0."ERR_CD" AS C5 
FROM "SESSION".CLEMTMP151212791 T0
```

キャッシュされた表がある状態で再度実行を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e05898b9-461c-bc9f-7307-00bed060ed66.png)

すると先ほど作られた表からのみ読んでいて、もともとのテーブルへのアクセスがなくなっています。キャッシュする前までの処理をショートカットすることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/0740e05d-fd4f-5284-33eb-86a79b991813.png)

#3. DBキャッシュが効かない場合
DBキャッシュが効くのはSQLプッシュバックが効く処理だけです。SQLプッシュバックが効かない場合は、Modeler内に一時ファイルをつくってデータをキャッシュします。

試しに@INDEXというSQLプッシュバックが効かない処理をいれて、キャッシュする設定をして実行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4fe81170-2510-fcec-f299-4134d252ace3.png)

以下のようにキャッシュされたテーブルから読んでいますが、新たな一時表は作られておらず、キャッシュのアイコンも書類のようなアイコンが緑になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/175cde50-48e6-7a54-4830-23c7345c93cc.png)

これを再度実行しますと、今度はもう一時表へのSELECTが行われません。Modeler Serverを使っていればModeler Server、使っていなければModeler Clientに一時ファイルをつくって、キャッシュしていますので、DBアクセス自体が発生していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4b23f5d0-5d61-66bf-d9c4-9d4e493ffd59.png)

#4. 注意事項
* Db2の場合DBキャッシュは一時表で作られますので、Db2との接続が切れると自動的に削除されます。
* DBによっては実表で作られることもあります。その場合はストリームを閉じた時点でDROP TABLEで削除されます。ですので、ストリームが異常終了した場合にはゴミ表が残ってしまうことがあります。
* 一時表にはパーティションキーやINDEXはありませんので、処理によっては効率が悪くなることもあります。パーティションキーやINDEXなどでチューニングしたい場合にはDBエクスポートで実表で中間テーブルを作成してください。

#5. 環境
Modeler18.2.2
Windows 10
Db2 on Cloud

#6. 参考
ノードのキャッシュ・オプション
https://www.ibm.com/support/knowledgecenter/ja/SS3RA7_18.2.2/modeler_mainhelp_client_ddita/clementine/cache_options.html

Modelerデータ加工Tips#01-「キャッシュ」で後続処理の効率をアップ | IBM ソリューション ブログ https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-01/