5

次のような1つのクエリをカプセル化する1つの引数(日付)を持つ関数があります

SELECT COUNT(*)
  FROM tbl
 WHERE some_date_field BETWEEN param_date - INTERVAL '0 1:00:00' DAY TO SECOND
                           AND param_date

私がやりたいのは、このクエリの結果をttl=1分でどこかにキャッシュすることです。キャッシュされた結果は、現在のセッションだけでなく、すべてのセッションで共有する必要があります。

何か提案はありますか?

PS:はい、Oracle関数の結果キャッシュについては知っていますが、要件に適合していません。
PPS:はい、次のような値で2番目の人工引数を作成できますdate in format of yyyymmddhh24mi。これは毎分変化し、関数の結果キャッシュを使用できますが、キャッシュの依存関係を内部に隠すことができるソリューションであることを願っています。

4

2 に答える 2

5

グローバルアプリケーションコンテキストと、更新間隔が1分のジョブを使用してコンテキストを設定します。

PS:INTERVAL '1' HOURは、 INTERVAL '0 1:00:00' DAY TO SECONDよりも短く、意味があります。

于 2011-03-31T08:56:57.017 に答える
4

このクエリの結果をキャッシュし、すべてのセッションでキャッシュを共有する必要があります。私が考えることができる唯一の方法は、クエリを関数呼び出しでラップし、結果を小さなテーブルに格納することです。この関数は、小さなテーブルにクエリを実行して、カウントが過去1分以内にすでに保存されているかどうかを確認し、保存されている場合はそれを返します。

定期的にジョブを実行して「キャッシュテーブル」内の1分より古い行を削除することで、テーブルを小さく保つことができます。さらに良いのは、おそらくそれを切り捨てることです。

ただし、元のSELECT COUNT(*)が比較的高価なクエリである場合にのみ、これが有益であることがわかります。

于 2011-03-31T08:17:48.223 に答える