SQE、CQEって何ですか?
Question
IBM i (AS/400)V7R1 から IBM i (AS/400)V7R3 へ移行した後に、データの表示順が変わったファイルがあります。
何故でしょうか。
Answer
IBM i (AS/400)V7R1 以前はCQEを優先使用していましたが、SQEの方がCQEよりも高速に最適化されるため、IBM i (AS/400)V7R2 へのバージョンアップに伴う仕様変更で、SQEを優先使用するようになりました。
CQEはクラシック参照エンジン、SQEはSQL参照エンジンの略です。
どちらもデータベースにSQLでアクセスする際に使用される参照エンジンで、どちらを優先して使用するかによって返ってくる結果セットが異なる場合があります。
例えば、Key#1 , Key#2 を指定しているファイルでRUNQRYを実行した場合、下記の図のように結果セットが異なる場合があります。
- CQE:Keyフィールドは指定順で処理されるが、その他のフィールドは、登録順で処理される。
- SQE:SQL実行が優先されるので、Keyフィールド以外の結果が異なる場合がある。
IBM i (AS/400)V7R2 以降でもCQEを優先使用したいユーザーのために、SQEからCQEに変更する手段が用意されていました。
それが、照会オプション・ファイルQAQQINI内のSQE_NATIVE_ACCESSパラメーターです。
SQE_NATIVE_ACCESSパラメーターを*NOへ変更する事で、IBM i V7R1 以前のようにCQEを優先使用できます。
しかし、IBM i (AS/400)V7R4 からは、このパラメーターを*NOに変更してもパラメーター自体が無視されるので、自動的にSQEが優先使用されます。
この情報は、IBM i (AS/400)V7R4のプログラム資料説明書で記載されています。
※IBM i(AS/400) V7R4のプログラム資料説明書より抜粋。
IBM i(AS/400) V7R2 や IBM i(AS/400) V7R3 で、SQE_NATIVE_ACCESSパラメーターを変更して結果の違いを確認してみてはいかがでしょうか。
【SQEからCQEに変更する方法】
- システム全体に反映する場合
1.1. QSYS/QAQQINIをQUSRSYSへデータと共にコピーします。
例:
CRTDUPOBJ OBJ(QAQQINI) FROMLIB(QSYS) OBJTYPE(*FILE) TOLIB(QUSRSYS) DATA(*YES)
1.2. STRSQLと実行し、下記例のUPDATE文を実行して、QUSRSYS/QAQQINIのデータを変更します。
例:
UPDATE QUSRSYS/QAQQINI SET QQVAL='*NO' WHERE QQPARM='SQE_NATIVE_ACCESS'
"QUSRSYS の QAQQINI の 1 行が更新された" メッセージの表示で変更は完了です。
- ジョブ毎に変更する場合
2.1. QAQQINIを任意のライブラリーにコピーします。この例では、テスト用のライブラリーTEST_LIBにコピーします。
例:
CRTDUPOBJ OBJ(QAQQINI) FROMLIB(QSYS) OBJTYPE(*FILE) TOLIB(TEST_LIB) DATA(*YES)
2.2. STRSQLと実行し、下記例のUPDATE文を実行して、TEST_LIB内のQAQQINIのデータを変更します。
例:
UPDATE TEST_LIB/QAQQINI SET QQVAL='*NO ' WHERE QQPARM='SQE_NATIVE_ACCESS'
2.3. CHGQRYAコマンドでQRYOPTLIBパラメーターをTEST_LIBに変更します。
例:
CHGQRYA QRYOPTLIB(TEST_LIB)
この場合、ジョブのサインオフするまで有効です。
パラメーターを変更したら、以下のように確認しておきましょう。
【QAQQINIの変更を確認する方法】
以下は、QAQQINIをテスト用のライブラリーTEST_LIBにコピーして確認した例です。
STRSQLと実行し、
SELECT * FROM TEST_LIB.QAQQINI
でテスト用のライブラリーTEST_LIB内のQAQQINIのパラメーターを確認します。
次ページキーで下記の内容を表示します。
SQE_NATIVE_ACCESSの値が *NO だと CQE、*YES だと SQE です。
F21キーで分割してから、F20キーで右に移動すると確認しやすいですね。
後はRUNQRYコマンド等を実行して、返ってくる結果セットの違いを比較してみてください。
by 槻樹