Oracle Analytics Cloud： データセットを設定する。データセットの設定で"キャッシュ"と"ライブ"が混在しているときの動きについてみてみる

はじめに
---
Oracle Analytics Cloud ： データセットで、データベースの表のデータアクセスの設定では、"自動キャッシュ"と"ライブ"が設定できます。複数のデータベースの表からなるデータセットを作成したとき、
ある表は"自動キャッシュ"で、別の表が"ライブ"と設定している場合、どのような動きになるかみてみたいと思います。


前提
---
・データセットを作成したことがある
・データセットで、データアクセスの設定をしたことがある
・開発者メニューを設定したことがある

開発者メニューは、右上部の"アカウント"をクリックし、
<img width="400" alt="{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/ae625cf1-0916-c45e-c6c6-880cef680b0f.png"/>

"拡張"をクリック、"開発者オプションの有効化"をON(右側にツマミを移動)し、保存します。
<img width="400" alt="{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/623a19a8-0a93-8b19-64b5-6a9c47c7fae1.png"/>

複数表からなるデータセットの用意
---
複数表からなるデータセットを作成します。
PRODUCTS表、SALES表をデータセットに追加します
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d622932d-2201-550f-0f11-e0aea7463390.png)

PRODUCTS表のデータアクセスの設定を"自動キャッシュ"に変更します。
PRODUCTS表を右クリックします。メニューで"定義の編集"をクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7b9c0872-283a-554d-c8a8-c09fdea7e570.png)

データアクセスで、ライブから自動キャッシュに変更します。自動キャッシュをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fe520db1-57aa-968f-5b0f-44ac857e2457.png)

"OK"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f5423cc1-c952-1b9a-453a-14e8445714ed.png)

同様に、SALES表で"ライブ"に設定されていることを確認します。
下部の結合ダイアグラムをクリックします。SALES表を右クリックし、メニューから定義の編集をクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fc4e391f-bf49-ec11-977a-220162eea2ca.png)

データアクセスが"ライブ"になっていることを確認します。OKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5365af49-9c73-7888-26bb-3df116b88cda.png)

データセットを保存します。右上部の保存アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c1e6d4c6-2ee0-b714-6ab1-7620b541067a.png)

データセットの名前を入力します。
DS_SALESLIVE_PRODUCTSCACHEと入力し、OKをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/8ded114d-ee05-4e21-e7cf-c8915b84825d.png)

ワークブックを作成する
---
DS_SALESLIVE_PRODUCTSCACHEのデータセットを使ってワークブックを作成します。
DS_SALESLIVE_PRODUCTSCACHEデータセットを開き、"ワークブックの作成"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7d4cd5b2-74d2-6a81-e370-4864db629b83.png)

SALES表からTIME_ID、SALES_AMOUNTを選択し、右の空白のキャンバスにドロップします。
列を複数選択するときは、TIME_IDをクリックし、Ctrlキーを押しながらSALES_AMOUNTをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/3e186083-d5b0-ee2f-addc-11b70787e6ab.png)

PRODUCTS表からPROD_NAMEをクリックします。PROD_NAMEをドラッグし上部のフィルタペインにドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/c8c0da91-f584-9f0f-84f6-19df671a704f.png)

PROD_NAMEで、1つ選択します。128MB SDメモリ・カードをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/43fe279e-0bd1-a15d-080a-ef723f1f1281.png)

下図のように問合せエラーになることがあります。詳細をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/bb1610e7-6668-b167-0797-8a72b625f981.png)

"状態: HY000。コード: 43121。[nQSError: 43121] 最大行制限を超過しています" とでており、こちらは、OACがデータベースに対して物理SQLで問合せをした後、受け取った結果がOACで設定されている最大行制限を超える場合に出力されるエラーです。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/85b7436e-ab21-3d3e-97d9-9412749ceb34.png)

つまり、以下のようなことが考えられます。データアクセスが"自動キャッシュ"のPRODUCTS表と"ライブ"のSALES表を結合して、結果を取得しますが、混在していると、OACでの結合となるためSALES表からデータをとってきます。その際、最大行制限が超過してしまった。ということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/024e782c-1f85-f5f5-ed6f-a08087e380fa.png)

最大行制限は、2023/1/27現在、以下です。今回は1 OCPUの環境のため125000行の制限を超過したことになります。
https://docs.oracle.com/cd/E83857_01/paas/analytics-cloud/acoci/create-services.html#GUID-7D6DB4EE-8DD5-44C5-9B6E-9FA847463A5F
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/fa9408e6-5b3f-dcc9-41bc-919facd8ad25.png)

実際どのような物理SQLが発行されているかは、開発者モードで確認できます。
開発メニューを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/4fb698e1-1a9e-b6b0-5a77-96e56f7a0443.png)

リフレッシュをクリックし、再度実行します。"実行ログ"のタブで、下部の方にスクロールダウンします。物理SQLが表示されていますが、PROD_NAME,PROD_IDの検索条件はついていないことがわかります。以下エラーも出力されています。
[nQSError: 43119] Query Failed: 
[nQSError: 43121] Max Row Limit Exceeded
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/48fa9885-f8eb-a6bf-ef22-e4b7292dc9d3.png)

このように複数のデータベースの表からのデータセットをつかっていて、データアクセスの設定で"自動キャッシュ"と"ライブ"が混在しているときに、結合はOAC側で実施されます。その際、最大行数の制限が超過したエラーがでた場合、データセット内のデータアクセスの設定を"ライブ"にすることで対処できます。

両方を"ライブ"にした場合は、PROD_NAMEの絞り込みもDB側で実施されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/bffe36c2-ac29-26d3-71dd-53af96be8c6f.png)

以上