3. 性能チューニングを怠るべからず
3.9. 有効なインデックスの作成漏れによる大量検索でのレスポンス低下
Symfoware Server べからず集
Symfoware Server べからず集 [インデックス作成(定義、創成)の例]
上記の例でインデックスを作成した場合、scan type が INDEX KEY SCAN に変わ り、レスポンスが改善します。
大量検索によるレスポンス低下の例
業務アプリケーションで設計した内容よりも多くのレコードの検索が発生しているた め、レスポンスが低下している場合があります。
検索件数は、rdbps コマンド で -i を指定し、Record(R/W) の "R" の値で確認でき ます。
rdbpsコマンドでは、当該コネクションの処理内容が、DSI単位で、データベースに
接続後からの累積値で出力されます。
複数のDSIを使用している場合は、検索対象の全てのDSIに対する出力結果を確認 してください。
Access plan:
Convert SQL statement:
SELECT TBL1.C1 FROM USR1.TBL1 WHERE TBL1.C1=?
:
[1] SCAN ELEMENT table name USR1.TBL1
scan type INDEX KEY SCAN(1) :
CREATE DSO TBL1IDXDSO INDEX ON USR1.TBL1(C1) TYPE BTREE (PAGESIZE1(16), PAGESIZE2(1))
CREATE DSI TBL1IDXDSI INDEX DSO TBL1IDXDSO BASE TBL1DSI
ALLOCATE INDEX ON DBSP SIZE 1M, BASE ON DBSP SIZE 100M
rdbsloader ‐i DB1.TBL1IDXDSI ‐x
Symfoware Server べからず集 [rdbps -iの出力例]
業務アプリケーションで設計した内容よりも多くのレコードの検索が発生している原 因として、探索条件に指定した列の中に、インデックスが定義されていない列が含ま れていることが考えられます。
以下のSQL文では、表 "USR1.TBL2" のレコードを検索しています。
表 "USR1.TBL2"では、C1にインデックスが定義されていますが、C0にはインデッ クスが定義されていません。
上記のSQL文の探索条件には、C1だけでなくC0も指定しています。
C1だけでは一意にならないレコードが大量に存在する場合、C0にインデックスが付 加されていないため、検索対象のレコードを効率よく絞り込むことができません。結 果として、より多くの処理時間が必要になってしまいます。
この例の場合、表 "USR1.TBL2"に、(C0, C1)のキーで構成されるインデックスを作 成することで、探索条件に指定した全ての列に対してインデックスが付与されます。
C1だけでなく、C0に対しても、データの絞込みが可能になり、データの大量検索を 抑止できることから、レスポンスが改善します。
SELECT COUNT(C1) AS KENSU FROM USR1.TBL2 WHERE C1>=?
AND C1<=?
AND C0 IN('20130101') WITH OPTION LOCK_MODE(FL)
RDBII rdbps DATE:2014/11/11 TIME:12/34/56 Uid Pid Status Elapse Type Name ADMINISTRATOR 4612 ACT 0:00 SQL xxxxx/DB1
DSI Resource‐Information
Record(R/W) Index(R/W) Page(R/W) LockWait WaitTime DeadLock DBName.DSIName 3460406/ 0 0/ 0 193174/ 0 0 0:00 0 TESTDB.T_TBL2DSI
Symfoware Server べからず集 [インデックス作成(定義、創成)の例]
3.9.2. 未対処時の影響 (1) 現象分類
性能劣化 (2) 現象/原因
【現象】
アプリケーションのレスポンスが上がらない。
また、レスポンスが上がらない以外に、以下のような現象が発生する場合もありま す。
・ CPU負荷の上昇
・ メモリの不足
・ バッファの枯渇
・ ソート作業域へのI/O多発によるDISK負荷の上昇
【原因】
探索条件に指定された列に対して、有効なインデックスが作成されておらず、検索 対象のレコードが多くなり、Symfowareで操作するデータ量が多くなるためです。
3.9.3. 備考
ACCESS_PLANの指定について
JDBCを使用している場合は、ctuneparamオプションにCLI_ACCESS_PLANを指 定してください。
ODOS を 使 用 し てい る場 合 は 、ODBC デ ータソ ー ス のオ プシ ョ ン設定 で 、
CLI_ACCESS_PLANを指定してください。
.NET Data Provider を 使 用 し て い る 場 合 は 、tuneparam キ ー ワ ー ド に
ACCESS_PLANを指定してください。
CREATE DSO TBL2IDXDSO INDEX ON USR1.TBL2(C0,C1) TYPE BTREE (PAGESIZE1(16), PAGESIZE2(1))
CREATE DSI TBL2IDXDSI INDEX DSO TBL2IDXDSO BASE TBL2DSI
ALLOCATE INDEX ON DBSP SIZE 1M, BASE ON DBSP SIZE 100M
rdbsloader ‐i DB1.TBL2IDXDSI ‐x
Symfoware Server べからず集
参考マニュアル
【アクセスプラン】
・ Symfoware Server チューニングガイド
2.2.2 SQL文のアクセスプランと実行状態の内訳を表示する
第4章 チューニング
【インデックス作成】
・ Symfoware Server アプリケーション開発ガイド(共通編)
3.3.1 インデックスを定義する
【コマンドリファレンス】
・ Symfoware Server コマンドリファレンス 2.50 rdbps
Symfoware Server べからず集