PL/SQL全局缓存
功能描述
Vastbase在Oracle兼容模式下支持PL/SQL全局缓存,实现在PL/SQL在编译过程中,在函数本身和某些依赖项没有发生改变的时候(即判断函数/包有效的情况下),编译得到的产物可以在全局重复使用。且全局缓存支持多会话并发使用。
PL/SQL全局缓存可通过如下参数控制:
GUC参数 参数功能 参数介绍 enable_plpgsql_global_compile_cache 开启全局缓存功能,若开启本参数,则对函数/包进行编译后,其将被放入全局缓存。修改重建函数/包后,其将在下一次检查编译时重新存入全局缓存。 参数为实例级别,默认值为off,修改后重启数据库生效。 plpgsql_compile_cache_max_size 用于设置允许全局缓存的大小,当全局缓存达到内存上限时,将会进行缓存替换。 参数为实例级别,默认值为100000000,修改后重启数据库生效。 PL/SQL全局缓存可通过如下函数查看相关信息:
函数名称 函数功能 调用语句 pl_global_compile_cache_entrys 用于查询所有缓存项目的状态、哈希值、类型等信息。 select * from pl_global_compile_cache_entrys();
pl_global_compile_cache_status 用于统计当前全局缓存拥有的缓存项数量和占用内存的大小 select * from pl_global_compile_cache_status();
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
示例
1、设置参数开启全局缓存功能。
![]()
修改如下参数后应重启数据库使其生效。
set enable_plpgsql_global_compile_cache=1;
2、创建函数,其中在一个函数中调用另一个函数。
create or replace FUNCTION sp_block7
(
MYINTEGER IN INTEGER ,
MYCHAR OUT VARCHAR2(200)
)
returns VARCHAR2(200)
AS $$
DECLARE
BEGIN
MYCHAR := 'sp_block is called';
raise info 'MYINTEGER is %', MYINTEGER;
RETURN ;
END;
$$LANGUAGE plpgsql;
create or replace FUNCTION sp_tempsp7()
returns INTEGER
AS $$
DECLARE
MYINTEGER INTEGER ;
MYCHAR VARCHAR2(20);
PSV_SQL VARCHAR2(200);
BEGIN
MYINTEGER := 1;
PSV_SQL := 'begin call sp_block7(:a,:b);end;';
EXECUTE IMMEDIATE PSV_SQL USING IN MYINTEGER, OUT MYCHAR;
raise info 'MYCHAR is %', MYCHAR;
RETURN 0;
END;
$$LANGUAGE plpgsql;
3、多次调用函数。
call sp_tempsp7();
call sp_tempsp7();
call sp_tempsp7();
返回结果均为如下:
INFO: MYINTEGER is 1
CONTEXT: SQL statement "call sp_block7(:a,:b)"
PL/pgSQL function inline_code_block line 1 at EXECUTE statement
PL/pgSQL function public.sp_tempsp7() line 9 at EXECUTE statement
INFO: MYCHAR is sp_block is called
sp_tempsp7
------------
0
(1 row)
4、查看当前全局缓存函数拥有的缓存项数量和占用内存的大小(以用户实际情况为准)。
select * from pl_global_compile_cache_status();
返回结果为如下:
total_memory | used_memory | entry_count
--------------+-------------+-------------
100000000 | 218784 | 2
(1 row)