更新时间:2026-07-28 GMT+08:00
分享

会话级存储过程内计划缓存管控

前提条件

开启GUC参数。

SET enable_global_plsqlcache = on;

注意事项

  1. 新增GUC参数local_plsqlcache_threshold与GUC参数max_execute_functions同时生效,两者同时开启且设置过小时,可能存在互相干扰,导致无法达到上限值。
  2. GUC参数local_plsqlcache_threshold设置过小时,可能会导致内存频繁释放,影响性能。

操作步骤

  1. 创建两个会话(session1和session2),session1执行存储过程,session2进行观测。
  2. session1中执行SELECT pg_current_sessid()进行获取当前的会话的sessionid。
  3. session1中创建存储过程并调用该存储过程。
  4. 在session2中查询session1中存储过程占用缓存总数。
  5. 在session1中将内存上限local_plsqlcache_threshold设置为4的查询结果。
  6. 在session2中查询session1中存储过程占用缓存总数,内存未淘汰。
  7. 在session1中将内存上限local_plsqlcache_threshold设置为(4的查询结果 - 1)。
  8. 在session2中查询session1中存储过程占用缓存总数。session1创建的存储过程缓存被淘汰。

示例

  1. 创建会话session1,获取当前的会话的sessionid。
    -- session s1
    gaussdb=# SELECT pg_current_sessid();
     pg_current_sessid
    -------------------
                   167
  2. 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)
  3. 创建会话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)
  4. 在session1中将内存上限local_plsqlcache_threshold设置为3的查询结果。
    -- session s1
    gaussdb=# SET local_plsqlcache_threshold = 22528;
  5. 在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)
  6. 在session1中将内存上限local_plsqlcache_threshold设置为(3的查询结果 - 1)。
    -- session s1
    gaussdb=# SET local_plsqlcache_threshold=22527;
  7. 在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)
  8. 释放存储过程。
    gaussdb=# DROP PROCEDURE p1;
    DROP PROCEDURE

相关文档