0
点赞
收藏
分享

微信扫一扫

oracle 12c pdb环境绑定执行计划的实战


在之前的一篇BLOG:oracle 12c pdb架构下绑定执行计划问题​​中提到,PDB环境下绑定执行计划和删除绑定的执行计划,均需要切换到相应的PDB下进行。下面就来看一次实际的PDB环境使用coe_xfr_sql_profile.sql脚本进行绑定执行计划的实战。

1.找出问题SQL

找出问题SQL,可以说是最关键的一步,方便有很多,可能是通过操作系统 层面top进程OS PID来找数据库中的进程SID,再找到对应SQL_ID,或AWR中TOP SQL查找SQL_ID,或根据开发人员提供的SQL文本查找SQLID,或查当前V$SESSION查活动会话或结合等待事件找到的SQL_ID等等方法,这里不详细展开了。

本次通过查当前V$SESSION查活动会话或结合等待事件找到SQL_ID,查出SQL语句给开发人员确认是反映慢的问题模块,开始排查SQLU问题

SQL> select sql_id,PLAN_HASH_VALUE,CHILD_number,EXECUTIONS,BUFFER_GETS/EXECUTIONS,ELAPSED_TIME/EXECUTIONS/1000,SQL_PROFILE from gv$sql where sql_id='5z6juzbk9cmgs';

SQL_ID PLAN_HASH_VALUE CHILD_NUMBER SQL_PROFILE EXECUTIONS BUFFER_GETS/EXECUTIONS ELAPSED_TIME/EXECUTIONS/1000
------------- --------------- ------------ --------------- ---------- ---------------------- ----------------------------
5z6juzbk9cmgs 62581372 0 4 400 5.9815
5z6juzbk9cmgs 62581372 1 1 110 15.829
5z6juzbk9cmgs 2045481334 2 1 185138 879.956
5z6juzbk9cmgs 62581372 3 1 246 15.856
5z6juzbk9cmgs 1654761781 4 1 204 12.477
5z6juzbk9cmgs 3119162075 5 1 204 18.077
5z6juzbk9cmgs 62581372 6 15 141.133333 2.288
5z6juzbk9cmgs 3043534417 0 1542 1440667.68 23136.9738 ====>>>明显较慢的SQL执行计划,执行次数都在这里

2.发现SQL有多个执行计划且执行计划效率差异大

从几个不同效率执行计划对比可以发现,主要差异在于使用了不同的索引;这种情况下使用收集统计信息方式,可能优化器也会得到更准确、更高效率的执行计划;但是后续随着数据变化可能出现统计信息不准确,仍存在执行计划变化的可能; 因此本次我们使用固定执行计划 的方式。

指定CHILD_ID查看执行计划方法
select * from table(dbms_xplan.display_cursor('SQL_ID',0,'advanced'));
…………
-----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 13 (100)| |
| 1 | SORT ORDER BY | | 1 | 120 | 13 (24)| 00:00:01 |
|* 2 | FILTER | | | | | |
|* 3 | HASH JOIN | | 1 | 120 | 12 (17)| 00:00:01 |
|* 4 | VIEW | | 1 | 35 | 7 (29)| 00:00:01 |
|* 5 | COUNT STOPKEY | | | | | |
| 6 | VIEW | | 1 | 34 | 7 (29)| 00:00:01 |
|* 7 | SORT UNIQUE STOPKEY | | 1 | 53 | 6 (17)| 00:00:01 |
|* 8 | FILTER | | | | | |
|* 9 | TABLE ACCESS BY INDEX ROWID BATCHED| DOCS_NORMAL_REPORT_REC | 1 | 53 | 5 (0)| 00:00:01 |
|* 10 | INDEX RANGE SCAN | DOCS_NORMAL_REPORT_DATE_INDEX | 1 | | 4 (0)| 00:00:01 |
|* 11 | TABLE ACCESS BY INDEX ROWID BATCHED | DOCS_NORMAL_REPORT_REC | 1 | 85 | 5 (0)| 00:00:01 |
|* 12 | INDEX RANGE SCAN | DOCS_NORMAL_REPORT_DATE_INDEX | 1 | | 4 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------------------------

 3.找到SQLID对应的PDB名称并进行执行计划固定

在之前的一篇BLOG:oracle 12c pdb架构下绑定执行计划问题中提到,PDB环境下绑定执行计划和删除绑定的执行计划,均需要切换到相应的PDB下进行。

当有多个PDB时,首先需要确认PDB信息,V$SESSION的CON_ID列指明了这个信息,

SQL> select USERNAME,INST_ID,sid,CON_ID,program,machine,sql_id,event,BLOCKING_SESSION ,BLOCKING_INSTANCE
2 from gv$session where status='ACTIVE' and machine not like '%node%';

SQL> /

USERNAME INST_ID SID CON_ID PROGRAM MACHINE SQL_ID EVENT BLOCKING_SESSION BLOCKING_INSTANCE
---------- ---------- ---------- ---------- -------------------- ------------------------- -------------------- ---------------------------- ---------------- -----------------
test 1 2123 4 w3wp.exe WORKGROUP\WIN08-test1SJK 5z6juzbk9cmgs SQL*Net message from client
test 1 2286 4 w3wp.exe WORKGROUP\WIN-08-test1YY 5z6juzbk9cmgs buffer busy waits
test 1 2734 4 w3wp.exe WORKGROUP\WIN08-test1SJK 5z6juzbk9cmgs SQL*Net message from client


SQL> show pdbs

CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 AAAH READ WRITE NO
4 test1 READ WRITE NO ====>>>根据CON_ID找CON_NAME

进行绑定
SQL> alter session set container=test1;

Session altered.

SQL>@coe_xfr_sql_profile.sql

 

举报

相关推荐

0 条评论