Skip to content

适用虚谷数据库版本

v12.10.8



适用虚谷数据库版本

v12.10.8


过程函数中SQL重用多少次后重解析规划(proc_reuse_cnt)

📄字数 1.1K
👁️阅读量 加载中...

引入版本

v11.0.0

功能描述

存储过程或函数中的 SQL 在执行多少次后需要强制重新解析并规划执行计划。

参数属性

属性属性值
参数类型INTEGER
默认值1
取值范围[0, 10000]
影响范围系统级
修改方式在线修改,立即生效

使用场景说明

  1. 该参数控制静态 SQL 的执行计划在存储过程/函数中被重用多少次后更新()。
proc_reuse_cnt作用及影响
0每次执行存储过程或函数中的静态 SQL 时,都重用已有的执行计划
1每次执行存储过程或函数中的静态 SQL 时,都重新解析 SQL 并生成新的执行计划
100执行存储过程或函数中的静态 SQL 满 100 次时,重新解析 SQL 并生成新的执行计划

示例

sql
-- 在线修改 proc_reuse_cnt
SQL> SET proc_reuse_cnt TO 1;

-- 在线查看 proc_reuse_cnt
SQL> SHOW proc_reuse_cnt;

/*
 * 场景一:
 *   1. proc_reuse_cnt = 0;
 *   2. auto_commit = true;
 */
SQL> CREATE TABLE t1(c1 INTEGER, c2 VARCHAR); -- 创建表对象;
SQL> INSERT INTO t1 VALUES(1, '0x00001')(2, '0x00002'); -- 插入数据;
SQL> CREATE OR REPLACE PROCEDURE test_procedure(a INTEGER) AS 
         TYPE rec IS TABLE OF t1%ROWTYPE;
         row  rec;
     BEGIN
         row:=rec();
         row.extend;
         SELECT * INTO row(1) FROM t1 WHERE c1=a LIMIT 1;
         SEND_MSG(row(1).c2);
     END;
     /  -- 定义存储过程;
SQL> exec test_procedure(1); -- PL/SQL 中的 DML 语句使用旧的执行计划;
SQL> exec test_procedure(2); -- PL/SQL 中的 DML 语句使用旧的执行计划;

/*
 * 场景二:
 *   1. proc_reuse_cnt = 1;
 *   2. auto_commit = true;
 *   3. 基于 "场景一" 的环境;
 */
SQL> exec test_procedure(1); -- 执行时重新规划执行计划;
SQL> exec test_procedure(2); -- 执行时重新规划执行计划;

/*
 * 场景三:
 *   1. proc_reuse_cnt = 100;
 *   2. auto_commit = true;
 *   3. 基于 "场景一" 的环境;
 */
SQL> exec test_procedure(1); -- PL/SQL 中的 DML 语句使用旧的执行计划;

...  -- 重复执行多次,仍然使用旧的执行计划;

SQL> exec test_procedure(2); -- 执行第 100 次时重新规划执行计划;