oracle SQL计划管理 4

2023年 12月 7日 26.1k 0

1.1.1.1   修改SQL计划基线

创建SQL计划基线时,可以使用dbms_spm包下的alter_sql_plan_baseline过程来修改某些指定的参数。sql_handle和plan_name参数确定被修改的SQL计划基线。必须指定这两个参数中的一个。Attribute_name和attribute_value参数确定被修改的属性以及它们的新值。Attribute_name参数可以接受以下值。

 

Ø  enabled:可以将这个属性设置为yes或no,但只有在设置为yes时,查询优化器才可以使用SQL计划基线。

Ø  fixed:将这个属性设置为yes时,不会将新的执行计划添加到SQL计划基线中,结果就是之后它都不能进化。此外,如果SQL计划基线包含多个可接受的执行计划,固定的执行计划要比未固定的好。可以将这个值设置为yes或no。

Ø  autopurge:这个属性设置为yes的SQL计划基线会在一段时间不使用后自动删除。可以将这个值设置为yes或no。

Ø  plan_name:这个属性用来更改SQL计划名。它可以是不超过30个字符的任意字符串。

Ø  description:这个属性用来为SQL计划基线附加描述。它可以是不超过500个字符的任意字符串。

 

下面的调用中禁用与执行计划关联的SQL计划基线:

ret 
:= 
dbms_spm.alter_sql_plan_baseline(

sql_handle =>'SQL_492bdb47e8861a89'

plan_name =>'SQLPLAN
4kayv8zn8c6n93fdbb376',

attribute_name =>'enabled',

attribute_value =>'no');

 

1.1.1.2   激活SQL计划基线

查询优化器只有在初始化参数optimizer_usesql_plan_baselines设置为TRUE(这是默认值)时才会使用SQL计划基线。可以在会话或系统级别更改它。

 

1.1.1.3   移动SQL计划基线

dbms_spm包提供了多个过程用来在数据库之间移动SQL计划基线。比如,当SQL计划基线需要在开发环境或测试数据库中生成然后移动到生产环境中时。正如图11-10所示,会提供以下特性。

Ø  可以使用create_stgtab_baseline过程来创建临时表。

Ø  可以使用pack_stgtab_baseline函数将SQL计划基线从数据字典复制到临时表中。

可以使用unpack_stgtab_baseline函数将SQL计划基线从临时表复制到数据字典中。

请注意,在数据库之间移动临时表依靠的是数据移动技术(例如,数据泵(Data
Pump或旧有的导出(export)和导入(import)程序),而不是依靠dbms_spm包本身。

下面的例子引用自baseline_clone.sql脚本,展示了如何将SQL计划基线从一个数据库复制到另一个。首先,在当前模式下创建mystgtab临时表:

dbms_spm.create_stgtab_baseline(

table_name=>'MYSTGTAB',

table_owner=>user,

tablespace_name=>'USERS');

 

接着将SQL计划基线从数据字典复制到临时表中。可以通过以下四种方法识别要处理哪些SQL计划基线。

Ø  通过sql_handle和可选的plan_name参数来准确识别SQL计划基线。

Ø  选择所有在SQL语句文本中包含特定字符串的SQL计划基线。为此,可以使用支持通配符(例如,%)的sql_text参数。请注意该参数区分大小写。

Ø  选择所有符合以下一个或多个参数的SQL计划基线:creator、origin、enabled、accepted、fixed、module和action。如果指定了多个参数,那么就需要满足它们的所有值。

Ø  处理所有SQL计划基线。这种方法不需要指定参数。

 

下面的调用展示了如何准确识别SQL计划基线:

ret:=dbms_spm.pack_stgtab_baseline(

table_name=>'MYSTGTAB',

table_owner=>user,

sql_handle='SQL_492bdb47e8861a89',

plan_name=>'SQL_PLAN_4kayv8zn8c6n93fdbb376');

 

此时,依靠数据移动程序,将mystgtab临时表从一个数据库复制到另一个。

 

最后,将SQL计划基线从临时表复制到目标数据库的数据字典中。要识别处理的SQL计划基线,可使用与pack_stgtab_baseline函数同样的方法。下面的调用展示了通过SQL语句的文本来识别SQL计划基线:

 

ret := dbms_spm.unpack_stgtab_baseline(

table_name=>'MYSTGTAB',

table_owner=>user,

sql_text=>'%FROM t%');

 

1.1.1.1   删除SQL计划基线

可以使用dbms_spm包下的drop_sql_plan_baseline过程从数据字典中删除SQL计划基线。sql_handle和sql_name参数指定要删除的执行计划和/或SQL计划基线。这两个参数至少需要设置一个。下面的调用说明了这一点:

ret := dbms_spm.drop_sql_plan_baseline(

sql_handle=>'SQL_492bdb47e8861a89',

plan_name=>'SQL_PLAN_4kayv8zn8c6n93fdbb376');

 

未使用的SQL计划基线有自动删除条件设置的属性设置为yes,在一段时间后自动删除。默认的周期是53周。当前值可以使用类似以下的查询通过dba_sql_management_config视图查看(在12.1及之后版本中,也存在cdb版本的视图):

select parameter_value FROM
dba_sql_management_config WHERE parameter_name ='PLAN_RETENTION_WEEKS';

 

可以调用dbms_spm包下的configure过程来修改保留期。可以更改为5至523周。下面的例子展示了如何更改为12周。如果将parameter_value参数设置为NULL,就会恢复成默认值:

dbms_spm.configure(

parameter_name=>'plan_retention_weeks',

parameter_value=>12);

 

1.1.1.2   权限

自动捕获SQL计划基线时(即,通过将初始化参数optimizer_capture_sql_plan_baselines设置为

TRUE来实现),并不需要特别的权限来创建它们。

 

dbms_spm包只能由拥有administer sql management object系统权限的用户执行(默认情况下,dba角色拥有该权限)。SQL计划基线并不存在对象权限。

 

最终用户不需要特定权限也可以使用SQL计划基线。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论