针对 sql 优化 ,我们使用 sqltrpt 工具可以一气呵成,其中会使用到 dbms_sqltune.accept_sql_profile
ACCEPT_SQL_PROFILE #接受及应用一个SQL_PROFILE执行计划给某条SQL
DBMS_SQLTUNE.ACCEPT_SQL_PROFILE (
task_name IN VARCHAR2, -------------->执行优化的任务名
object_id IN NUMBER := NULL, -------------->对象编号,一般不填
name IN VARCHAR2 := NULL, -------------->制定的sql_profile名称,如果不填则由系统指派
description IN VARCHAR2 := NULL, -------------->该执行计划的描述信息
category IN VARCHAR2 := NULL); ------------->需要与该SESSION的sqltune_category参数相匹配
task_owner IN VARCHAR2 := NULL, ------------->任务的所有者
replace IN BOOLEAN := FALSE, ------------->如果此sql_profile已存在,则决定是否替换,默认值为不替换
force_match IN BOOLEAN := FALSE, ------------->是否强制匹配此执行计划与所有HASH值相同的SQL,类似 CURSOR_SHARING参数的FORCE
profile_type IN VARCHAR2 := REGULAR_PROFILE); ------------->sql_profile的类型,默认为REGULAR_PROFILE,可修改为 PX_PROFILE,表示此执行计划变更为并行执行
使用 profile :
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_35330',task_owner => 'SYS', replace => TRUE);
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_35330',task_owner => 'SYS', replace => TRUE, profile_type =>DBMS_SQLTUNE.PX_PROFILE);
在sql 的执行计划里面我们可以看到以下信息 :
SQL profile SYS_SQLPROF_016c98ffe13c0001 used for this statement
同时我们可以在 dba_sql_profiles 里面查看profile 信息
Note ----- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- - dynamic sampling used for this statement (level=6) - automatic DOP: skipped because of IO calibrate statistics are missing - SQL profile SYS_SQLPROF_016c98ffe13c0001 used for this statement 87 rows selected |
如果我们 不想要 profile 应用在sql 上,可以使用下面的方法进行drop
exec dbms_sqltune.drop_sql_profile('SYS_SQLPROF_016c98ffe13c0001');
如果我们想再次应用profile 怎么办呢?再次执行
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_35330',task_owner => 'SYS', replace => TRUE);
execute dbms_sqltune.accept_sql_profile(task_name => 'TASK_35330',task_owner => 'SYS', replace => TRUE, profile_type =>DBMS_SQLTUNE.PX_PROFILE);
但这时候profile 的name 已经改变
Note ----- PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- - dynamic sampling used for this statement (level=6) - automatic DOP: skipped because of IO calibrate statistics are missing - SQL profile SYS_SQLPROF_016c994c2b560002 used for this statement 87 rows selected |