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:是的,我们可以创建具有一些值的第二个人工参数,例如date in format of yyyymmddhh24mi它每分钟更改一次,并且我们能够使用函数结果缓存,但我希望这是一个允许我隐藏内部缓存依赖项的解决方案。

4

2 回答 2

5

我将使用全局应用程序上下文和刷新间隔为 1 分钟的作业来设置上下文。

PS:INTERVAL '1' HOURINTERVAL '0 1:00:00' DAY TO SECOND更短更有意义

于 2011-03-31T08:56:57.017 回答
4

您希望缓存此查询的结果,并在所有会话中共享缓存。我能想到的唯一方法是将查询包装在函数调用中,将结果存储在一个小表中。该函数将查询小表以查看最近 1 分钟内是否已存储计数,如果是,则返回。

您可以通过定期运行作业来删除“缓存表”中超过 1 分钟的行来保持表较小 - 或者更好的是,可能截断它。

但是,如果原始 SELECT COUNT(*) 是一个相对昂贵的查询,我只能看到这是有好处的。

于 2011-03-31T08:17:48.223 回答