Db2 for i のSQLパフォーマンスデータ取得手順 と User_Info / User_Info_Basic の比較

IBM i サービスの下記2つはほぼ同じデータを取得できますが、処理速度が体感上結構変わります。

***[QSYS2.User_Info](https://qiita.com/gomAnomalocaris/items/360e2ba6697640fc5601)***
***[QSYS2.User_Info_Basic](https://qiita.com/gomAnomalocaris/items/580c0052efe60a78d337)***

この2つのSQLモニターを取得して処理時間を比較してみたいと思います。

## Db2 for i SQLパフォーマンス・モニター（DBモニター）の取得手順

### ①ACS, Navigator for i, IBM i OSコマンドでデータ取得を開始

#### ACSの場合
ACS -> データベース -> SQL Performance Center -> パフォーマンス・モニター の画面から、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/46ac18c0-dda9-99ee-a52c-563a9e583595.png)

新規 -> パフォーマンス・モニター を選択します。次へボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/eb97abbb-b1d1-3c18-bd80-94979b97605f.png)

DBモニター名（任意）とデータの保管先ライブラリー（任意）を指定します。次へボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5df4ba6a-4a1b-fdf3-1e7c-95de70f21465.png)

この画面で、取得するSQLの範囲を限定できます。SQLパフォーマンス・モニターはSQL実行の明細を取得するのでシステム負荷が高い処理、と言えます。できる限り無用なデータ収集はさけるべきでしょう。

今回はACS スクリプト実行画面からQZDASOINITジョブ経由でIBM i サービスを実行します。ユーザー・プロファイルも自分のものなので、その二つに絞るように選択しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9fd18062-9aaf-d67c-b781-86fa22d13073.png)

次へボタンを押すと確認画面が出るので終了ボタンを押します。（画面省略）

#### Navigator for i の場合

執筆時点ではNavigator for i の旧版（2001ポート）のみ実行できるようです。（ということはIBM i 7.4以前でのみ実行可能）

データーベース　→　すべてのタスク　→　ヘルスおよびパフォーマンス　→　新規SQLパフォーマンス・モニター　を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/63f186f2-b38d-a5d5-9d60-c66e3da48e84.png)

※以降の指定方法はACSと同様なので省略します。

#### IBM i OSコマンドから

```
STRDBMON
```

コマンドで実行します。
こちらも今回は詳細省略します。


### ②ACSからSQLパフォーマンス・モニターの状態を確認する。

パフォーマンス・モニターの画面を見ると、上で指定した、USER_INFO_DBMON01　が開始されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a5575e5b-db4d-d1d0-825f-5a3b872fec0f.png)


以上でSQLのデータ取得準備が完了します。

## SQLを実行しデータを取得する。

それではACSスクリプト実行から　IBM i サービス2つを実行します。

実行するIBM i サービスは以下の2つです。

```
SELECT * FROM QSYS2.USER_INFO
  WHERE SIGN_ON_ATTEMPTS_NOT_VALID > 0 ;

SELECT * FROM QSYS2.USER_INFO_BASIC
  WHERE SIGN_ON_ATTEMPTS_NOT_VALID > 0 ;
```

※2つのSQLステートメントを実行するので1つ1つをセミコロン ; で区切ります。
実行時の画面がこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/f0731383-a11e-6e43-bbab-3d6f5366cb92.png)

## SQLパフォーマンス・モニターを停止する。

SQLの実行が完了したら、SQLパフォーマンス・モニターを停止します。

ACSから対象のモニターを右クリックして 終了 を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b5f1db21-8476-8321-35ef-3739c5041246.png)

以上でデータ収集が完了します。

## SQLパフォーマンス・モニター・データの分析

分析もACSから開始できます。SQLパフォーマンスモニターの画面で、モニター名を右クリックして、***ステートメントの表示***を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e5d7cabf-d869-f1be-1cbb-1dff00594c19.png)

次の画面が表示されます。左側のウィンドウで表示するSQLを絞り込めます。ここでは2つしか実行していないのでフィルター無しで全件表示（2件表示）しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/02d22231-1070-8415-5146-2e6efd56ae1a.png)

ここでまず処理時間が分かります。（この時間はIBM i 内部＝サーバー処理時間です）
1行目：USER_INFO        は処理時間　約2.79秒
2行目: USER_INFO_BASIC　は処理時間　約0.01秒

でした。かなり異なりますね。
私の感覚が相当アバウトだという事も改めて分かりました(^^;


## ちょっと深掘りしてみる　Visual Explain で図示してみる

今回の目的は達成されていますが、もうちょっと見てみましょう。
1行目を右クリックして　***Visual Explain***を選択してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/848188e0-e3de-bd9f-2c53-921e65051997.png)

すると、1行目のSQL(USER_INFOビュー）の実行明細が図示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/486c7f48-38e4-83ab-b874-2acfebe2b7f0.png)

左側のアイコン１つ１つがSQLの実行段階明細を表示しており、それぞれの処理時間や処理レコード件数、どのようなアクセス方法・処理方法か等の明細が右側に表示されます。

上記は最終ステップの処理明細を図示していますが、左側で別なアイコンをクリックすると、クリックした処理についての明細が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b7c983bd-813c-771f-0cfd-1c44bc542c49.png)


もうひとつ、2行目もVisual Explainすると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1f18fbb6-1692-7056-1eab-25d530e65099.png)

2つ上の1行目の図示と比較するだけでずいぶん処理ステップが少ないこともわかりますね。

Visual Explainの使い方などは探すと出てくると思います。そのうちやってみたいと思います。

## db2batch でIBM i Db2 for i のSQLを測定できるか？

すみません、本日時間切れです・・また別稿で検証してみます。（guri guriさんすみません・・）