更新时间:2026-07-28 GMT+08:00
会话级存储过程内计划缓存管控
前提条件
开启GUC参数。
SET enable_global_plsqlcache = on;
注意事项
- 新增GUC参数local_plsqlcache_threshold与GUC参数max_execute_functions同时生效,两者同时开启且设置过小时,可能存在互相干扰,导致无法达到上限值。
- GUC参数local_plsqlcache_threshold设置过小时,可能会导致内存频繁释放,影响性能。
操作步骤
- 创建两个会话(session1和session2),session1执行存储过程,session2进行观测。
- session1中执行SELECT pg_current_sessid()进行获取当前的会话的sessionid。
- session1中创建存储过程并调用该存储过程。
- 在session2中查询session1中存储过程占用缓存总数。
- 在session1中将内存上限local_plsqlcache_threshold设置为4的查询结果。
- 在session2中查询session1中存储过程占用缓存总数,内存未淘汰。
- 在session1中将内存上限local_plsqlcache_threshold设置为(4的查询结果 - 1)。
- 在session2中查询session1中存储过程占用缓存总数。session1创建的存储过程缓存被淘汰。
示例
- 创建会话session1,获取当前的会话的sessionid。
-- session s1 gaussdb=# SELECT pg_current_sessid(); pg_current_sessid ------------------- 167 - session1中创建存储过程并调用该存储过程。
gaussdb=# CREATE OR REPLACE PROCEDURE p1() AS gaussdb$# v1 int; gaussdb$# v2 varchar; gaussdb$# BEGIN gaussdb$# v1 := 1; gaussdb$# v2 := 'abc'; gaussdb$# END; gaussdb$# / CREATE PROCEDURE gaussdb=# gaussdb=# CALL p1(); p1 ---- (1 row)
- 创建会话session2,在session2中查询session1中存储过程占用缓存总数。
-- session s2 gaussdb=# SELECT sum(totalsize) FROM gs_session_memory_detail WHERE (contextname LIKE 'Func % runtime mem ctx' OR contextname LIKE 'CachedPlan%' OR contextname LIKE 'SPI Plan' OR contextname LIKE 'Subpro % runtime mem ctx') AND substring(sessid, strpos(sessid, '.')+1)='167'; sum ------- 22528 (1 row)
- 在session1中将内存上限local_plsqlcache_threshold设置为3的查询结果。
-- session s1 gaussdb=# SET local_plsqlcache_threshold = 22528;
- 在session2中查询session1中存储过程占用缓存总数,内存未淘汰。
-- session s2 gaussdb=# SELECT sum(totalsize) FROM gs_session_memory_detail WHERE (contextname LIKE 'Func % runtime mem ctx' OR contextname LIKE 'CachedPlan%' OR contextname LIKE 'SPI Plan' OR contextname LIKE 'Subpro % runtime mem ctx') AND substring(sessid, strpos(sessid, '.')+1)='167'; sum ------- 22528 (1 row)
- 在session1中将内存上限local_plsqlcache_threshold设置为(3的查询结果 - 1)。
-- session s1 gaussdb=# SET local_plsqlcache_threshold=22527;
- 在session2中查询session1中存储过程占用缓存总数。session1创建的存储过程缓存被淘汰。
-- session s2 gaussdb=# SELECT sum(totalsize) FROM gs_session_memory_detail WHERE (contextname LIKE 'Func % runtime mem ctx' OR contextname LIKE 'CachedPlan%' OR contextname LIKE 'SPI Plan' OR contextname LIKE 'Subpro % runtime mem ctx') AND substring(sessid, strpos(sessid, '.')+1)='167'; sum ----- (1 row)
- 释放存储过程。
gaussdb=# DROP PROCEDURE p1; DROP PROCEDURE
父主题: 操作指导