パッケージキャッシュとは?

パッケージキャッシュはOracleのライブラリキャッシュに該当する(またはクエリーキャッシュ)。 最適化された動的SQLの実行計画はパッケージ・キャッシュに格納され使いまわされる。SQLのコンパイル処理はCPU負荷が高い処理であるため、キャッシュが機能しているか監視しておくとよい。

パッケージキャッシュ・ヒット率

SELECT
    CASE
        WHEN PKG_CACHE_LOOKUPS > 0 THEN
            DEC(FLOAT(PKG_CACHE_LOOKUPS - PKG_CACHE_INSERTS) * 100 / FLOAT(PKG_CACHE_LOOKUPS),5,2)
        ELSE
            0
    END
FROM
    TABLE(MON_GET_SERVICE_SUBCLASS('SYSDEFAULTUSERCLASS', 'SYSDEFAULTSUBCLASS', - 2)) AS T

もちろん高いほうが良いが、古いアプリケーションでPreparedStatementを使用していなかったりすると60%前後の数値などもあったりする。

パッケージ・キャッシュ・オーバーフロー回数

db2 select PKG_CACHE_NUM_OVERFLOWS from SYSIBMADM.SNAPDB 

パッケージキャッシュ・ヒット率がよりもオーバーフローしているほうが問題。 遅くなっている場合、オーバーフローしていないか確認しよう。

1トランザクションあたりのパッケージ挿入数

私的には見ていないが、こんな指標もあるので紹介程度。

SELECT
   CASE
        WHEN TOTAL_APP_COMMITS > 0 THEN
            DEC(FLOAT(PKG_CACHE_INSERTS) / FLOAT(TOTAL_APP_COMMITS))
        ELSE
            0
    END
FROM
    TABLE(MON_GET_SERVICE_SUBCLASS('SYSDEFAULTUSERCLASS', 'SYSDEFAULTSUBCLASS', - 2)) AS T

対策1:pckcachesz パラメータを確認

pckcacheszパラメータを確認しよう。パッケージのキャッシュサイズが設定されている。 近年ではAUTOMATICがデフォルト。AUTOMATICであるならそのままでよい。 固定値である場合、AUTOMATICを検討してもいい。

db2 GET DB CFG FOR ${database_name}

対策2:PreparedStatementを使用してるか確認する。

PreparedStatement化も検討する。使っててもbindしてなかったりするアプリケーションもある。

対策3:実メモリを上げる

pckcacheszパラメータがAUTOMATICで、PreparedStatementもしっかり使われているなら、実メモリ上げるしかないかと。

まとめ

パッケージキャッシュ・ヒット率は、一般向けのアクセス数の多いアプリケーションなら、シビアにやってるかもしれないが、アクセス数の少ない社内業務アプリケーションなら複雑なSQLの実行計画の方を気を使ったほうがいい。ただパッケージキャッシュ・オーバーフローはパフォーマンスを急激に低下させる可能性もあるので、気を付けたほうがいい。