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)
相关链接