ステートメントキャッシュ機能は、SQL文をコネクション単位でキャッシュすることで、次に同じ文字列のSQL文を実行するときに文の解析と作成を省略します。これによって、繰り返し実行されるループやメソッドの中で同じ文字列のSQL文を実行するような場合に性能が向上します。また、コネクションプーリング機能と組み合わせた場合にも性能の向上が期待できます。
以下に、ステートメントキャッシュ機能の仕組みを説明します。
同じ文字列のSQL文であるかを判断する際、大文字と小文字は異なる文字とみなします。
prepareStatementメソッドまたはprepareCallメソッドで準備されたSQL文だけがステートメントキャッシュの対象です。
PreparedStatementクラスまたはCallableStatementクラスのcloseメソッドが実行されたときにキャッシュに登録し、prepareStatementメソッドまたはprepareCallメソッドが実行されるたときに、指定されたSQL文がキャッシュに存在するかどうかを判定して、ヒットした場合には文の解析と作成を省略します。
キャッシュの上限は、PGConnectionPoolDataSourceクラスまたはPGXADataSourceクラスのsetMaxStatementsメソッドで指定します。0以外の有効な値を指定しない場合は、キャッシュされません。キャッシュの上限に達した場合には、最も長く使われなかったキャッシュが破棄されます(Least Recently Used (LRU)方式)。
PreparedStatementクラスのsetPoolable(boolean)メソッドでfalseが指定された場合、準備されたSQL文のcloseメソッドを実行しても、このSQL文はキャッシュに登録されません。
キャッシュ登録の制御
ステートメントキャッシュ機能が有効の場合に、PreparedStatementクラスのsetPoolable(boolean)メソッドで、SQL文をキャッシュするかどうかを設定できます。
設定する値は、以下のとおりです。
ステートメントキャッシュ機能が有効でも、SQL文はキャッシュされません。
ステートメントキャッシュ機能が有効の場合、SQL文をキャッシュします。
キャッシュ数について
コネクション単位で異なる文字列のSQL文数を指定してください。
注意
アプリケーションの変更により指定値が適切でなくなる可能性がありますので、定期的にpg_stat_statementの実行により適切な値を確認/更新することを推奨します。
キャッシュされたSQL文情報は一定のメモリを消費するため、メモリ消費の上限値について考慮する必要があります。ステートメントキャッシュ機能により消費するメモリの目安は以下のとおりです。
クライアント
アプリケーションの1プロセスあたりのコネクション数 × キャッシュ数 × 2KB(注)
サーバ
アプリケーションの1プロセスあたりの最大コネクション数 × キャッシュ数 × 10KB(注)
注: 1SQL文あたりのメモリ消費の目安