过程函数中SQL重用多少次后重解析规划(proc_reuse_cnt)
📄字数 1.1K
👁️阅读量 加载中...
引入版本
v11.0.0
功能描述
存储过程或函数中的 SQL 在执行多少次后需要强制重新解析并规划执行计划。
参数属性
| 属性 | 属性值 |
|---|---|
| 参数类型 | INTEGER |
| 默认值 | 1 |
| 取值范围 | [0, 10000] |
| 影响范围 | 系统级 |
| 修改方式 | 在线修改,立即生效 |
使用场景说明
- 该参数控制静态 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 次时重新规划执行计划;