oracle 10g中如何缓存函数的查询结果?

Posted

技术标签:

【中文标题】oracle 10g中如何缓存函数的查询结果?【英文标题】:How to cache the query result of a function in oracle 10g? 【发布时间】:2013-09-05 06:38:46 【问题描述】:

我正在使用 oracle 10g。 我在一个包中有以下函数,它将在包中多次调用。相反,我想维护“函数结果缓存”(11g 可用),我会在执行查询之前先在缓存中查找。这可以用 10g 实现吗?还是我必须选择其他选项才能实现?

function f_get_col_data_type(tab_name varchar,
                              col_name varchar
                              ) return varchar is
    v_col_data_type user_tab_columns.data_type%type;
  begin
    select data_type
      into v_col_data_type
      from user_tab_columns
     where upper(table_name) = upper(tab_name)
       and upper(column_name) = upper(col_name);

    return v_col_data_type;
end f_get_col_data_type;

【问题讨论】:

在 10g 中,您需要自己进行缓存(或者简单地通过 Oracle 的缓冲区缓存依赖“全局”缓存) 感谢您的回复。我不想在这里维护全局缓存。那么,我该如何使用其他技术呢?我的意思是还有哪些其他可能的方式来做自己? 【参考方案1】:

将函数放入一个包中,同时在包中添加一个PLSQL表,索引为VARCHAR2。

在第一次执行时,使用“tab_name || '.' 检查表。 || col_name" 组合为索引(哈希)。

如果为空,则运行查询并将数据写入 PLSQL 表,使用 tab_name || '。' || col_name 作为索引。

当在每个会话中调用此函数的查询运行时,第一次调用会更长,因为它构建表,后续调用会更快。

使用这种方法需要注意的是内存管理(大数据、会话数)、陈旧数据 - 不适合易失性数据表。您也应该考虑在包中使用“免费”功能来清除缓存。

【讨论】:

【参考方案2】:

您可以使用“DETERMINISTIC”子句将值存储在缓存中。请看下面的例子

    CREATE OR REPLACE FUNCTION text_length(a CLOB) 
   RETURN NUMBER DETERMINISTIC IS
BEGIN 
  RETURN DBMS_LOB.GETLENGTH(a);
END;

【讨论】:

在@hemanth 用例的上下文中,这个答案是不正确的!他试图缓存受数据库查询影响的函数结果。 Oracle's documentation 谈到 DETERMINISTIC 关键字:“不要指定此子句来定义 [...] 以任何可能影响函数返回结果的方式访问数据库的函数。这样做的结果将不会被捕获如果 Oracle 数据库选择不重新执行该函数。”

以上是关于oracle 10g中如何缓存函数的查询结果?的主要内容,如果未能解决你的问题,请参考以下文章

如何将选择查询的结果发送到oracle 10G中邮件的消息正文

MySQL查询缓存

oracle 10g 在查询结果列中添加rownum列,查询出的条数增多。

Result Cache特性之SQL QUERY结果集缓存

oracle10g中,如何查询正则表达式匹配指定字符串的匹配个数?

如何清除Oracle中的所有缓存项