PL/SQLでは同じ入力に対して同じ結果を返す純粋関数を多用するケースがあります。しかし大規模な計算や集計を伴う関数を何度も呼ぶと、パフォーマンスが大きく低下することもあります。そこで役立つのがOracleの「結果キャッシュ(FUNCTION RESULT_CACHE)」です。これは関数の戻り値をキャッシュし、同じ入力値の呼び出しではキャッシュ結果を返すことで処理を高速化します。ここでは基本構文、利用例、キャッシュの管理方法、注意点を解説します。
FUNCTION RESULT_CACHEとは
RESULT_CACHEを指定した関数は、呼び出し時にキャッシュを参照して同じ引数の結果があれば即座に返します。キャッシュはセッションをまたいで共有されるため、複数ユーザーからの呼び出しでも効果があります。データが頻繁に変わらず計算コストが高い処理に適しています。
基本的な使い方
関数定義にRESULT_CACHE
を付与するだけで利用できます。
-- Fibonacci数列を計算する例
CREATE OR REPLACE FUNCTION fib(n NUMBER) RETURN NUMBER
RESULT_CACHE
IS
BEGIN
IF n <= 1 THEN
RETURN n;
ELSE
RETURN fib(n-1) + fib(n-2);
END IF;
END;
/
この関数を繰り返し呼び出すと、キャッシュされた結果が返り、再計算を省略できます。
実用例:集計処理の高速化
売上合計や顧客情報取得など、一定期間で大きく変わらないデータを返す関数に有効です。
CREATE OR REPLACE FUNCTION get_customer_sales(p_cust_id NUMBER)
RETURN NUMBER
RESULT_CACHE RELIES_ON(customers, orders)
IS
v_total NUMBER;
BEGIN
SELECT SUM(o.amount)
INTO v_total
FROM orders o
WHERE o.customer_id = p_cust_id;
RETURN NVL(v_total, 0);
END;
/
RELIES_ON句を使うと、依存するテーブルが更新されたときにキャッシュを自動的に無効化できます。
キャッシュの確認と管理
キャッシュの内容や統計は以下のビューで確認できます。
-- キャッシュされた関数の情報
SELECT name, type, result_cache FROM user_procedures WHERE result_cache = 'YES';
-- キャッシュエントリの使用状況
SELECT * FROM v$result_cache_objects;
また、キャッシュを手動でフラッシュすることも可能です。
-- キャッシュの全削除
ALTER SYSTEM FLUSH RESULT CACHE;
注意点
- 結果キャッシュは共有リソースのため、サイズ制限に注意が必要です(パラメータRESULT_CACHE_MAX_SIZEで設定)。
- キャッシュはSAME入力に対してのみ有効。副作用を持つ関数や外部依存のある処理には適しません。
- テーブル更新が頻繁に行われる場合はキャッシュのメリットが薄れるため、RELIES_ONを指定するかキャッシュを使わない方がよいこともあります。
まとめ
PL/SQLのFUNCTION RESULT_CACHEは、計算コストが高いが結果が安定している関数を大幅に高速化できます。RELIES_ONを組み合わせることでキャッシュの整合性を保ちつつ、ビューや集計処理のパフォーマンスを最適化可能です。適切な関数に適用すれば、アプリケーション全体のレスポンス向上につながる強力な仕組みとなります。