i の SQL 環境のチューニング
会議で講演するときにフラストレーションがたまることの 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 に接続できます。開発者は Run SQL Scripts、Data Studio、Database Perspective in 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 サブシステムで実行されるよう、Run SQL Scripts で以下を実行しています。
CALL QSYS2.SET_SERVER_SBS_ROUTING('PAULT','*ALL','ALLFORPAUL');
パラメーターは以下の 3 つです。
- ユーザー・プロファイル、グループ・プロファイル、または補足プロファイル
- ジョブ名--QZDASOINIT、QRWTSRVR、または *ALL (両方の場合)
- サブシステムの名前
構成の詳細は *USRPRF オブジェクト内に格納されていますが、カタログ QSYS2.SERVER_SBS_ROUTING があります。これを使用して、代替サブシステムのユーザー構成にアクセスします。
select * from QSYS2.SERVER_SBS_ROUTING;
このコマンドで以下のように表示されます。
この select ステートメントを実行するのには、しばらく時間がかかることがある点にご注意ください。
QSYS2.SERVER_SBS_ROUTING は、ユーザー・プロファイル・オブジェクトからルーティング情報を取得する表関数上のビューです。したがって、ユーザー・プロファイル・オブジェクトは情報の取得のためアクセス中であり、しばらく時間がかかる場合があります。
確認
もちろん、Work with Active Jobs (WRKACTJOB) コマンドを使用して ALLFORPAUL サブシステムで実行しているすべてのジョブを見ることができます。しかし、良い機会なので、 TR10/TR2 で追加された他の SQL サービスの 1 つを見てみましょう。QSYS2.ACTIVE_JOB_INFO() は、WRKACTJOB コマンドおよび Open List of Jobs (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 Services とともに、各リリースに必要な TR はここで確認できます。
英国在住またはその近くにいるユーザーは、ユーザー・グループ・イベント http://www.i-ug.co.uk/ で最新情報を取得してください。