Db2 for i DBモニター詳細分析用の追加ビュー① SQL情報 QQQ1000

[こちらの記事](https://qiita.com/gomAnomalocaris/items/7b2f74b07a420f44e8c3)で紹介したDb2 for i の詳細なSQLパフォーマンス分析に関連して様々な追加ビューを作成する事が出来ます。

概説すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1b5d81c9-1bc3-406f-b35e-78867f47f5ce.png)

参考URL: https://www.ibm.com/docs/ja/i/7.5?topic=formats-sql-view

今回は上記のうち、一番基本のSQL情報を検索できるビュー（マニュアルではQQQ1000というビュー名）を作ってみたいと思います。

## 元テーブル（SQLパフォーマンスデータが格納されるテーブル）の確認

DBモニターの開始方法は[冒頭の記事リンク中](https://qiita.com/gomAnomalocaris/items/7b2f74b07a420f44e8c3)にありますが、STRDBMONコマンドのOUTFILEパラメーターで指定します。

マニュアル https://www.ibm.com/docs/ja/i/7.5?topic=monitor-database-examples を見ますと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/884b7436-41c8-41c2-a21f-48fc43745c19.png)

とあり、QSYS/QAQQDBMN テーブルから作成されることが分かります。
で、上記マニュアルの指定だと、PERFDATA テーブルにSQLパフォーマンス情報が格納されます。
この記事ではGOMALIB/PERFDATAを指定しています。

## SQL情報 QQQ1000 ビューの作成

まずは基本のSQL情報 QQQ1000　というビューを作ってみます。
[マニュアルページはこちら](https://www.ibm.com/docs/ja/i/7.5?topic=view-1000-sql-information)

### QQQ1000 ビューを作成

長大なSQLですが念のため貼ります。基本、マニュアルに記載のサンプル通りですが ***下記2点を修正しています。***
**・ビューを作成するライブラリー（スキーマ）名 GOMALIBを追加（1行目）**
**・基礎となるテーブル名だけ、GOMALIB.PERFDATA に変更（最下行から1つの行）**


```

Create View GOMALIB.QQQ1000 as 
  (SELECT QQRID as Row_ID, 
          QQTIME as Time_Created, 
          QQJFLD as Join_Column, 
          QQRDBN as Relational_Database_Name, 
          QQSYS as System_Name, 
          QQJOB as Job_Name, 
          QQUSER as Job_User, 
          QQJNUM as Job_Number, 
          QQI9 as Thread_ID, 
          QQUCNT as Unique_Count, 
          QQI5 as Unique_Refresh_Counter,
          QQUDEF as User_Defined, 
          QQSTN as Statement_Number, 
          QQC11 as Statement_Function, 
          QQC21 as Statement_Operation, 
          QQC12 as Statement_Type, 
          QQC13 as Parse_Required, 
          QQC103 as Package_Name, 
          QQC104 as Package_Library, 
          QQC181 as Cursor_Name, 
          QQC182 as Statement_Name, 
          QQSTIM as Start_Timestamp, 
          QQ1000 as Statement_Text, 
          QQC14 as Statement_Outcome, 
          QQI2 as Result_Rows, 
          QQC22 as Dynamic_Replan_Reason_Code, 
          QQC16 as Data_Conversion_Reason_Code, 
          QQI4 as Total_Time_Milliseconds, 
          QQI3 as Rows_Fetched, 
          QQETIM as End_Timestamp, 
          QQI6 as Total_Time_Microseconds, 
          QQI7 as SQL_Statement_Length, 
          QQI1 as Insert_Unique_Count, 
          QQI8 as SQLCode, 
          QQC81 as SQLState, 
          QVC101 as Close_Cursor_Mode, 
          QVC11 as Allow_Copy_Data_Value, 
          QVC12 as PseudoOpen, 
          QVC13 as PseudoClose, 
          QVC14 as ODP_Implementation, 
          QVC21 as Dynamic_Replan_SubCode, 
          QVC41 as Commitment_Control_Level, 
          QWC1B as Concurrent_Access_Resolution, 
          QVC15 as Blocking_Type, 
          QVC16 as Delay_Prepare, 
          QVC1C as Explainable, 
          QVC17 as Naming_Convention, 
          QVC18 as Dynamic_Processing_Type, 
          QVC19 as LOB_Data_Optimized, 
          QVC1A as Program_User_Profile_Used, 
          QVC1B as Dynamic_User_Profile_Used, 
          QVC1281 as Default_Collection, 
          QVC1282 as Procedure_Name, 
          QVC1283 as Procedure_Library, 
          QQCLOB2 as SQL_Path, 
          QVC1284 as Current_Schema, 
          QQC18 as Binding_Type, 
          QQC61 as Cursor_Type, 
          QVC1D as Statement_Originator, 
          QQC15 as Hard_Close_Reason_Code, 
          QQC23 as Hard_Close_Subcode, 
          QVC42 as Date_Format, 
          QWC11 as Date_Separator, 
          QVC43 as Time_Format, 
          QWC12 as Time_Separator, 
          QWC13 as Decimal_Point, 
          QVC104 as Sort_Sequence_Table ,
          QVC105 as Sort_Sequence_Library, 
          QVC44 as Language_ID, 
          QVC23 as Country_ID, 
          QQIA as First_N_Rows_Value, 
          QQF1 as Optimize_For_N_Rows_Value, 
          QVC22 as SQL_Access_Plan_Reason_Code,
          QVC24 as Access_Plan_Not_Saved_Reason_Code, 
          QVC81 as Transaction_Context_ID, 
          QVP152 as Activation_Group_Mark, 
          QVP153 as Open_Cursor_Threshold, 
          QVP154 as Open_Cursor_Close_Count, 
          QVP155 as Commitment_Control_Lock_Limit, 
          QWC15 as Allow_SQL_Mixed_Constants, 
          QWC16 as Suppress_SQL_Warnings, 
          QWC17 as Translate_ASCII, 
          QWC18 as System_Wide_Statement_Cache, 
          QVP159 as LOB_Locator_Threshold, 
          QVP156 as Max_Decimal_Precision, 
          QVP157 as Max_Decimal_Scale, 
          QVP158 as Min_Decimal_Divide_Scale ,  
          QWC19 as Unicode_Normalization, 
          QQ1000L as Statement_Text_Long, 
          QVP15B as Old_Access_Plan_Length, 
          QVP15C as New_Access_Plan_Length, 
          QVP151 as Fast_Delete_Count, 
          QQF2 as Statement_Max_Compression, 
          QVC102 as Current_User_Profile, 
          QVC1E as Expression_Evaluator_Used, 
          QVP15A as Host_Server_Delta, 
          QQC301 as NTS_Lock_Space_Id, 
          QQC183 as IP_Address, 
          QFC11 as IP_Type, 
          QQSMINT2 as IP_Port_Number, 
          QVC3004 as NTS_Transaction_Id,  
          QQSMINT3 as NTS_Format_Id_Length, 
          QQSMINT4 as NTS_Transatction_ID_SubLength, 
          QVRCNT as Unique_Refresh_Counter2, 
          QVP15F as Times_Run, 
          QVP15E as FullOpens, 
          QVC1F as Proc_In_Cache, 
          QWC1A as Combined_Operation, 
          QVC3001 as Client_Applname, 
          QVC3002 as Client_Userid, 
          QVC3003 as Client_Wrkstnname, 
          QVC3005 as Client_Acctng, 
          QVC3006 as Client_Progamid, 
          QVC5001 as Interface_Information, 
          QVC82 as Open_Options, 
          QWC1D as Extended_Indicators, 
          QWC1C as DECFLOAT_Rounding_Mode, 
          QWC1E as SQL_DECFLOAT_Warnings, 
          QVP15D as Worst_Time_Micro, 
          QQINT05 as SQ_Unique_Count, 
          QFC13 as Concurrent_Access_Res_Used, 
          QQSMINT8 as SQL_UDFs_Not_Inlined, 
          QVC3007 as Result_Set_Cursor, 
          QFC12 as Implicit_XMLPARSE_Option, 
          QQSMINT7 as SQL_XML_Data_CCSID, 
          QQSMINT5 as OPTIMIZER_USE, 
          QFC14 as XML_Schema_In_Cache, 
          QQC105 as Current_User,
          QFC15 as Row_Column_Access_Control,
          QQTIM12A as Temporal_System_Time,
          QFC16 as SYSTIME_Bind_Option,
          QFC17 as Temporal_System_Time_Query,
          QQDBCLOB1 as DBCLOB_HOSTVR,
          QQSMINT6 as StmtCmpReuseMin,
          QQINT06 as Blocks_Written,
          QFC18 as Override_Generated_Values
   FROM   GOMALIB.PERFDATA
   WHERE  QQRID=1000) 

```

※余談ですが、マニュアル記載のサンプルは、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/19a19eef-fe70-4d7d-a337-25e26bc77e2e.png)

となっていて、スラッシュ / でライブラリー名（スキーマ名）修飾されてるのですね、少し触った方は間違わないと思いますが初見だとここで引っかかる方もいそうです。記載直してほしいですね。。

さて上記SQLを実行すると、GOMALIB.PERFDATAにQQQ1000ビューが作成されます。

### QQQ1000ビューでSQL情報を確認してみる

冒頭のSTRDBMONコマンド実行時にSQLパフォーマンスデータの取得対象を絞り込みすることができます。たとえばユーザー名やIPアドレスなどです。ここでは特に絞り込まず、と実行しました。
OUTMBRの *ADD パラメーターは当記事作成以前に既にPERFDATAを作成してしまっていたためです。
```
 STRDBMON OUTFILE(GOMALIB/PERFDATA) OUTMBR(*FIRST *ADD) JOB(*ALL)
```

一番シンプルに検索してみます。
```
SELECT * FROM GOMALIB.PERFDATA ;
```

実行例が下記です。


たくさんSQLが実行済みですと（業務機ならそうなっているはず・・）、結構時間（とCPU）を喰うかもしれません。ちなみに私のPOWER10 S1014 0.x ? コアで占有に近いとせいぜい2-3秒程度ですが。。数百行しかログされていませんので実環境では参考にならないと思いますがfyi.です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e8b1189b-c201-49c9-a95f-2f7418b311cf.png)

ヘッダーが化けてしまっていますね・・7.5でパッチがちょっと古いのでその影響かもしれません。上記マニュアルページを見れば各カラムの名前は確認できます。

ログされたSQLは5250やACS SQL実行画面から行っていますので、ユーザー名やジョブ名からそれが分かります。

スクロールすると実行したSQL文が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b9067406-3fa2-4393-8e1c-308c184934fe.png)

何等かのステータス情報も沢山でていますね。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/da6d2c1f-c67e-4ccf-8119-258a533d46ba.png)

この辺は次回解説したいと思います。

### 実行例2 ユーザーIDを制限してみる。

実行ユーザーで絞る場合は、
```
SELECT * FROM GOMALIB.PERFDATA WHERE QVC102 = 'GOMA' ;
```

実行例は、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/66607432-19f5-4e30-980f-b0d5bf2e7a15.png)

ユーザー名がGOMAでフィルターされていますね。

スクロールすると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9e957aed-cf1c-4b3d-8ba2-bfe758c905cc.png)

QQ1000 カラムを見るとSQL文の他にもカーソルクローズされた等の情報もありました。

続く