DBMS_SPM 包,例如LOAD_PLANS_FROM_CURSOR_CACHE,官网中介绍了语法及示例,不知道这个示例是啥意思?

DBMS_SPM 包,例如LOAD_PLANS_FROM_CURSOR_CACHE,官网中介绍了语法及示例,不知道这个示例是啥意思?如下网页,搜索示例。
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003273184
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003981240

调用,应该执行call dbms_spm.load_plans_from_cursor_cache(‘testdb1’,‘1B92WERT2E7D7A402FA5AEC813DHTED4’,11109565326002978765);就可以了吧?
那给的如下示例是啥意思呢?是什么作用呢?
DECLARE
v_load_plans number;
BEGIN
v_load_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => ‘529F6E6454EF579C7CC265D1F6131D70’,
plan_hash_value => 13388268709115914355);
END;
/

1 个赞

感谢分享

https://open.oceanbase.com/blog/23379638544

还是没明白示例是想表达什么意思

SPM分为函数和存过,存过用call,函数不能用call

函数用select啊,就是不明白文档中的示例是啥意思用。

@论坛小助手 解答一下呗

该示例展示了如何使用 PL/SQL 调用 DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE 函数,将指定 SQL 的执行计划从 Plan Cache 加载到 SQL Plan Management (SPM) 基线中。具体步骤如下:

  1. 声明变量:声明一个变量 v_load_plans 来存储函数的返回值。
  2. 调用函数:调用 DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE 函数,传入 sql_idplan_hash_value 参数。
  3. 赋值:将函数的返回值赋给 v_load_plans 变量。
  4. 结束:使用 END; 结束 PL/SQL 块。

具体示例如下:

DECLARE
  v_load_plans number;
BEGIN
  v_load_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
     sql_id => '529F6E6454EF579C7CC265D1F6131D70',
     plan_hash_value => 13388268709115914355);
END;
/

在这个示例中,sql_id 是要加载的 SQL 的唯一标识符,plan_hash_value 是要加载的执行计划的哈希值。函数的返回值 v_load_plans 表示加载成功的计划数量。

如果你需要调用这个函数,可以参考以下步骤:

  1. 确定 sql_idplan_hash_value:你需要知道要加载的 SQL 的 sql_idplan_hash_value。这些信息可以通过查询 GV$SQL 视图或其他相关视图获得。
  2. 编写 PL/SQL 块:编写一个 PL/SQL 块来调用 DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE 函数。
  3. 执行 PL/SQL 块:在数据库中执行这个 PL/SQL 块。

例如,如果你有一个 sql_id 为 ‘1B92WERT2E7D7A402FA5AEC813DHTED4’ 和 plan_hash_value 为 11109565326002978765 的 SQL,可以这样调用:

DECLARE
  v_load_plans number;
BEGIN
  v_load_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
     sql_id => '1B92WERT2E7D7A402FA5AEC813DHTED4',
     plan_hash_value => 11109565326002978765);
END;
/

这个调用将会把指定的执行计划加载到 SPM 基线中。

检索到的文档如下:

  1. oceanbase.DBA_OB_IMPORT_TABLE_JOBS
  2. GV$OB_PL_CACHE_OBJECT

文档中的示例是oracle租户兼容模式的执行方式,也可以使用select。mysql模式是select。

所以以下两种方式是等效的
第一种:
DECLARE
v_load_plans number;
BEGIN
v_load_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(
sql_id => ‘529F6E6454EF579C7CC265D1F6131D70’,
plan_hash_value => 13388268709115914355);
END;
/

第二种
select DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(‘529F6E6454EF579C7CC265D1F6131D70’,13388268709115914355) from dual;

您看我的理解是不是对的?

这两样执行方式都可以,只是区分租户模式。

谢谢答复