oracle数据库中,原有SQL执行计划不理想,性能较差,本文构造新的执行计划,通过使用coe_xfr_sql_profile.sql绑定新的执行计划,提升性能,文中进行演示。
0. 环境
RHEL 7.7;
oracle database 19.3.0.0.0。
登录oracle后,创建示例表(scott.emp):
SQL> @?/rdbms/admin/utlsampl.sql
1. 执行示例查询并查看执行计划
1) 执行sql语句
set lines 300 pages 1000col sql_text for a50select * from scott.emp where deptno=30;
2) 通过sql_text查找语句的sql_id
SQL> select sql_id,hash_value,sql_text from v$sql where sql_text like '%scott.emp%';SQL_ID HASH_VALUE SQL_TEXT------------- ---------- --------------------------------------------------fxkq7t08j0t7b 286287083 select sql_id,hash_value,sql_text from v$sql wheresql_text like '%scott.emp%'1mvxd868z75nf 2448660110 select * from scott.emp where deptno=30
3) 通过sql_id查看执行计划
SQL> select * from table(dbms_xplan.display_cursor('1mvxd868z75nf',null));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 1mvxd868z75nf, child number 0-------------------------------------select * from scott.emp where deptno=30Plan hash value: 3956160932--------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 3 (100)| ||* 1 | TABLE ACCESS FULL| EMP | 6 | 522 | 3 (0)| 00:00:01 |--------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("DEPTNO"=30)Note------ dynamic statistics used: dynamic sampling (level=2)22 rows selected.
当前执行计划采用全表扫描,模拟生产较差语句。
2. 执行coe_xfr_sql_profile.sql生成outline
执行coe_xfr_sql_profile.sql:
SQL> @coe_xfr_sql_profile.sqlParameter 1:SQL_ID (required)Enter value for 1: 1mvxd868z75nf #输入sql_idPLAN_HASH_VALUE AVG_ET_SECS--------------- -----------3956160932 .004 #当前提示hash_value值Parameter 2:PLAN_HASH_VALUE (required)Enter value for 2: 3956160932 #输入上面提示的hash_valueValues passed to coe_xfr_sql_profile:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~SQL_ID : "1mvxd868z75nf"PLAN_HASH_VALUE: "3956160932"SQL>BEGIN2 IF :sql_text IS NULL THEN3 RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');4 END IF;5 END;6 /SQL>SET TERM OFF;SQL>BEGIN2 IF :other_xml IS NULL THEN3 RAISE_APPLICATION_ERROR(-20101, 'PLAN for SQL_ID &&sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');4 END IF;5 END;6 /SQL>SET TERM OFF;Execute coe_xfr_sql_profile_1mvxd868z75nf_3956160932.sqlon TARGET system in order to create a custom SQL Profilewith plan 3956160932 linked to adjusted sql_text.COE_XFR_SQL_PROFILE completed.
3. 创建一个较好的执行计划
1) 本次使用索引创建一个较好的执行计划
select /*+index(emp PK_EMP)*/ * from scott.emp where deptno=30;
2) 查看新执行计划
SQL>select * from table(dbms_xplan.display_cursor(null,null));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 987ba695ybyzp, child number 0-------------------------------------select /*+index(emp PK_EMP)*/ * from scott.emp where deptno=30Plan hash value: 2898514743----------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 42 (100)| ||* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 6 | 522 | 42 (0)| 00:00:01 || 2 | INDEX FULL SCAN | PK_EMP | 14 | | 2 (0)| 00:00:01 |----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("DEPTNO"=30)Note------ dynamic statistics used: dynamic sampling (level=2)23 rows selected.
当前执行计划已经走索引。
3) 使用coe_xfr_sql_profile生成本次的outline
SQL>@coe_xfr_sql_profile.sql 987ba695ybyzpParameter 1:SQL_ID (required)PLAN_HASH_VALUE AVG_ET_SECS--------------- -----------2898514743 .002Parameter 2:PLAN_HASH_VALUE (required)Enter value for 2: 2898514743Values passed to coe_xfr_sql_profile:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~SQL_ID : "987ba695ybyzp"PLAN_HASH_VALUE: "2898514743"SQL>BEGIN2 IF :sql_text IS NULL THEN3 RAISE_APPLICATION_ERROR(-20100, 'SQL_TEXT for SQL_ID &&sql_id. was not found in memory (gv$sqltext_with_newlines) or AWR (dba_hist_sqltext).');4 END IF;5 END;6 /SQL>SET TERM OFF;SQL>BEGIN2 IF :other_xml IS NULL THEN3 RAISE_APPLICATION_ERROR(-20101, 'PLAN for SQL_ID &&sql_id. and PHV &&plan_hash_value. was not found in memory (gv$sql_plan) or AWR (dba_hist_sql_plan).');4 END IF;5 END;6 /SQL>SET TERM OFF;Execute coe_xfr_sql_profile_987ba695ybyzp_2898514743.sqlon TARGET system in order to create a custom SQL Profilewith plan 2898514743 linked to adjusted sql_text.COE_XFR_SQL_PROFILE completed.
4. 替换outline内容,并绑定新的执行计划
1) 替换outline内容
将coe_xfr_sql_profile_987ba695ybyzp_2898514743.sql中的outline替换coe_xfr_sql_profile_1mvxd868z75nf_3956160932.sql中的outline,替换参考:
h := SYS.SQLPROF_ATTR(q'[BEGIN_OUTLINE_DATA]',q'[IGNORE_OPTIM_EMBEDDED_HINTS]',q'[OPTIMIZER_FEATURES_ENABLE('19.1.0')]',q'[DB_VERSION('19.1.0')]',q'[ALL_ROWS]',q'[OUTLINE_LEAF(@"SEL$1")]',q'[INDEX(@"SEL$1" "EMP"@"SEL$1" ("EMP"."EMPNO"))]',q'[BATCH_TABLE_ACCESS_BY_ROWID(@"SEL$1" "EMP"@"SEL$1")]',q'[END_OUTLINE_DATA]');
2) 执行绑定
SQL> @coe_xfr_sql_profile_1mvxd868z75nf_3956160932.sql
3) 再次查看执行计划
set lines 300 pages 1000select * from scott.emp where deptno=30;SQL>select * from table(dbms_xplan.display_cursor(null,null));PLAN_TABLE_OUTPUT------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID 1mvxd868z75nf, child number 0-------------------------------------select * from scott.emp where deptno=30Plan hash value: 2898514743----------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | | | 42 (100)| ||* 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 6 | 522 | 42 (0)| 00:00:01 || 2 | INDEX FULL SCAN | PK_EMP | 14 | | 2 (0)| 00:00:01 |----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("DEPTNO"=30)Note------ dynamic statistics used: dynamic sampling (level=2)- SQL profile coe_1mvxd868z75nf_3956160932 used for this statement24 rows selected.
此时,执行查询语句已经走新的执行计划。
文章转载自rundba,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




