メニューボタン
IBMi海外記事2020.05.27

i のSQL環境のチューニング

Paul Tuohy 著

著者まえがき: この 記事 は2015年11月に掲載された記事を元にしたものです。これは、私が本番で使用した最初のDB2 for iサービスの1つでした。それ以降、多用しています。

カンファレンスで講演するときにフラストレーションがたまることの1つに、自分が興味をそそられるトピックに関するセッションに参加したいのに、いつも自分の講演とバッティングしていることがあります。それでも、スケジュールの神が微笑んでくれるときもあります。英国のウィボストン レイクス エグゼクティブ センターで盛況裏に開催された、International i-Power 2015カンファレンスで講演したときが、まさにそうでした。

IBMのDB2 for iビジネス アーキテクトであるScott Forstie氏が「IBM i Services - SQL interfaces into the IBM i operating system」というテーマでプレゼンテーションをしていました。まさにこのトピックについてScott氏とiTalkを行ったばかりで、それについてもっと知りたいと思っていたところでした。

このトピックに関する私の関心事は、サービスの内容というよりむしろSQLの使用法だったことを認めないわけにはいきません。結局、私は開発者なので、運用/管理サービスについてはあまり気になりませんでした。しかし、まず最初に、興味をそそられたどころではない1つのサービスがありました。Scott氏に感謝しつつ、ここで紹介しようと思います。

問題

現在は、ユーザーは数えきれないほどの方法でiをデータベースに接続できます。開発者は、SQLスクリプトの実行、Data Studio、RDiのデータベース パースペクティブ、または他のデータベース開発クライアントを使用しています。PHPまたはJavaアプリケーションは、iで動作しているサーバーからデータベースに接続しています。クライアント アプリケーションは、JDBCまたはODBC接続を通してiに接続しています。ユーザーは、稼働中にSQLステートメントを構築する報告ツールを使用しています。また、他にも多くの可能性を見落としているに違いないと思っています。

これらの接続手段それぞれに、異なるパフォーマンス/チューニング要件があります。パワー ユーザーにはリソースが必要ですが、照会ツールでシステムに大きな負荷を掛けてはなりません。

問題は、クライアント要求に対するすべてのSQL処理を行うサーバー ジョブが、QUSRWRKサブシステムで動作するQZDASOINITジョブまたはQRWTSRVRジョブになることです。

どのジョブをどのクライアント要求に関連付けるかを調整する方法はありませんでした。

しかし、V7R1 TR10またはV7R2 TR2以降では、データベース接続に使用するユーザー プロファイル(またはグループ プロファイルまたは補足プロファイル)に基づいて指定されたサブシステムで、QZDASOINITジョブまたはQRWTSRVRジョブを実行できるようになりました。iへのデータベース接続を非常に具体的に制御できるようになりました。

サブシステムの作成

私はもちろんパワー ユーザーです。自分は、SQLの作成で求められるすべてのリソースを備えた自分のサブシステムを持つのにふさわしいと思っています。

まず、慣れ親しんだコマンド ラインを使用して、サブシステムと、対応するジョブ待ち行列を定義します。

CRTSBSD SBSD(QGPL/ALLFORPAUL) POOLS((1 *BASE))
        TEXT('Subsystem for Pauls SQL Masterpieces')
CRTJOBQ JOBQ(QGPL/ALLFORPAUL) 
        TEXT('JOBQ for Pauls SQL Masterpieces')              
ADDJOBQE SBSD(QGPL/ALLFORPAUL) JOBQ(QGPL/ALLFORPAUL)
         MAXACT(100) SEQNBR(40)  

続けて、クラスを定義します。クラス オブジェクトは、QZDASOINITジョブおよびQRWTSRVRジョブのタイム スライスおよび実行優先順位を定義します。

CRTCLS CLS(QGPL/ALLFORPAUL) RUNPTY(55) TIMESLICE(100) 
       TEXT('Class for Pauls SQL Masterpieces')  

クラス オブジェクトを指定したら、サブシステム記述を更新して、QZDASOINITジョブおよびQRWTSRVRジョブがサブシステムで実行している際に、クラスをそれらのジョブに使用するようにしなければなりません。

ADDPJE SBSD(QGPL/ALLFORPAUL) PGM(QSYS/QRWTSRVR) 
       JOBD(QGPL/QDFTSVR) CLS(QGPL/ALLFORPAUL) 
ADDPJE SBSD(QGPL/ALLFORPAUL) PGM(QSYS/QZDASOINIT)
       JOBD(QGPL/QDFTSVR) CLS(QGPL/ALLFORPAUL)  

準備完了です。サブシステムを起動します。

STRSBS SBSD(QGPL/ALLFORPAUL)  

ルーティングの変更

V7R1 TR10/V7R2 TR2で、新しいストアード プロシージャーQSYS2.SET_SERVER_SBS_ROUTINGが導入されました。これを使用して、特定のユーザー プロファイルについて、どのサブシステムでQZDASOINITジョブまたはQRWTSRVRジョブが実行されるか特定できます。

この例では、私のプロファイルがデータベースに接続する際に、QZDASOINITおよびQRWTSRVRがALLFORPAULサブシステムで実行されるよう、「SQLスクリプトの実行」で以下を実行しています。

CALL QSYS2.SET_SERVER_SBS_ROUTING('PAULT','*ALL','ALLFORPAUL');  

パラメーターは以下の3つです。

  1. ユーザー プロファイル、グループ プロファイル、または補足プロファイル
  2. ジョブ名 -- QZDASOINIT、QRWTSRVR、または*ALL(両方の場合)
  3. サブシステムの名前

構成の詳細は*USRPRFオブジェクト内に格納されていますが、カタログQSYS2.SERVER_SBS_ROUTINGがあります。これを使用して、代替サブシステムのユーザー構成にアクセスします。

select * from QSYS2.SERVER_SBS_ROUTING;  

これにより、以下のように表示されます。

このselectステートメントを実行するのには、しばらく時間がかかることがある点にご注意ください。QSYS2.SERVER_SBS_ROUTINGは、ユーザー プロファイル オブジェクトからルーティング情報を取得する表関数上のビューです。したがって、ユーザー プロファイル オブジェクトは情報の取得のためアクセス中であり、しばらく時間がかかる場合があります。

確認

もちろん、活動ジョブの処理(WRKACTJOB)コマンドを使用して、ALLFORPAULサブシステムで実行しているすべてのジョブを見ることができます。しかし、良い機会なので、TR10/TR2で追加された他のSQLサービスの1つを見てみましょう。QSYS2.ACTIVE_JOB_INFO()は、WRKACTJOBコマンドおよびジョブのリストのオープン(QGYOLJOB)APIで表示される詳細に似た情報を返すユーザー定義表関数です。

SELECT JOB_NAME, AUTHORIZATION_NAME,
       ELAPSED_CPU_PERCENTAGE, 
       ELAPSED_TOTAL_DISK_IO_COUNT, 
       ELAPSED_PAGE_FAULT_COUNT 
FROM TABLE(ACTIVE_JOB_INFO(
             SUBSYSTEM_LIST_FILTER => 'ALLFORPAUL')) x  
ORDER BY ELAPSED_CPU_PERCENTAGE DESC 
FETCH FIRST 20 ROWS ONLY;  

これにより、以下のように表示されます。

参考

ルーティング エントリーが定義されたプロファイルがデータベースに接続する場合に、サブシステムが開始していなかった場合はどうなるでしょうか。心配ありません。ルーティングはデフォルトでQUSRWRKサブシステムに戻るだけです。

ルーティングが、グループ プロファイルまたは補足プロファイルに基づくことができる点は非常に気に入っています。ルーティングの定義について、個々のプロファイル レベルに行く必要はありません。

現在、私たちのほとんどにとって、QUSRWRKで動作しているすべてのSQLジョブが正常に動作します。しかし、システムでデータベースの使用量が増えると、異なる接続環境のために調整が必要になるときが来ます。解決方法は、手元にあります。

関連情報

すべてのDB2 for iサービスについて、および各リリースに必要なTRについては、 https://www.ibm.com/support/pages/node/1119123で確認できます。

英国またはその近くにお住まいの方は、 http://www.i-ug.co.uk/にて、ユーザー グループ イベントの最新情報をご確認ください。

あわせて読みたい記事

PAGE TOP