加入收藏 | 设为首页 | 会员中心 | 我要投稿 吕梁站长网 (https://www.0358zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle - SPM固定执行计划(一)

发布时间:2020-12-30 12:04:57 所属栏目:站长百科 来源:网络整理
导读:一、前言 生产中偶尔会碰到一些sql,有多种执行计划,其中部分情况是统计信息过旧造成的,重新收集下统计信息就行了。但是有些时候重新收集统计信息也解决不了问题,而开发又在嗷嗷叫,没时间让你去慢慢分析原因的时候,这时临时的解决办法是通过spm去固定一
副标题[/!--empirenews.page--]

一、前言

生产中偶尔会碰到一些sql,有多种执行计划,其中部分情况是统计信息过旧造成的,重新收集下统计信息就行了。但是有些时候重新收集统计信息也解决不了问题,而开发又在嗷嗷叫,没时间让你去慢慢分析原因的时候,这时临时的解决办法是通过spm去固定一个正确的执行计划,等找到真正原因后再解除该spm。


二、解决办法

1. 通过dbms_xplan.display_cursor查看指定sql都有哪些执行计划

SQL> select * from table(dbms_xplan.display_cursor(‘&sql_id‘,null,‘TYPICAL PEEKED_BINDS‘));?

Enter value for sql_id: 66a4184u0t6hn
old   1: select * from table(dbms_xplan.display_cursor(‘&sql_id‘,null,‘TYPICAL PEEKED_BINDS‘))
new   1: select * from table(dbms_xplan.display_cursor(‘66a4184u0t6hn‘,‘TYPICAL PEEKED_BINDS‘))


SQL_ID  66a4184u0t6hn,child number 0
-------------------------------------
select /*for_test*/ * from test1 where object_id = 1

Plan hash value: 4122059633

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |       |       |   693 (100)|          |
|*  1 |  TABLE ACCESS FULL| TEST1 |   173K|    15M|   693   (1)| 00:00:09 |
---------------------------------------------------------------------------


SQL_ID  66a4184u0t6hn,child number 1
-------------------------------------
select /*for_test*/ * from test1 where object_id = 1

Plan hash value: 2214001748

-----------------------------------------------------------------------------------------
| Id  | Operation                   | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |           |       |       |     2 (100)|          |
|   1 |  TABLE ACCESS BY INDEX ROWID| TEST1     |    11 |  1056 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IDX_TEST1 |       |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

?

2. 查询该sql的历史执行情况

SQL> col snap_id for 99999999???????????????????????????????????????????????????????????????????????????????????
SQL> col date_time for a30??????????????????????????????????????????????????????????????????????????????????????
SQL> col plan_hash for 9999999999???????????????????????????????????????????????????????????????????????????????
SQL> col executions for 99999999????????????????????????????????????????????????????????????????????????????????
SQL> col avg_etime_s heading ‘etime/exec‘ for 9999999.99????????????????????????????????????????????????????????
SQL> col avg_lio heading ‘buffer/exec‘ for 99999999999??????????????????????????????????????????????????????????
SQL> col avg_pio heading ‘diskread/exec‘ for 99999999999????????????????????????????????????????????????????????
SQL> col avg_cputime_s heading ‘cputim/exec‘ for 9999999.99?????????????????????????????????????????????????????
SQL> col avg_row heading ‘rows/exec‘ for 9999999????????????????????????????????????????????????????????????????
SQL> select * from(?????????????????????????????????????????????????????????????????????????????????????????????
select distinct????????????????????????????????????????????????????????????????????????????????????????????
s.snap_id,?????????????????????????????????????????????????????????????????????????????????????????????????
to_char(s.begin_interval_time,‘mm/dd/yy_hh24mi‘) || to_char(s.end_interval_time,‘_hh24mi‘) date_time,??????
sql.plan_hash_value plan_hash,?????????????????????????????????????????????????????????????????????????????
sql.executions_delta executions,???????????????????????????????????????????????????????????????????????????
(sql.elapsed_time_delta/1000000)/decode(sql.executions_delta,1,sql.executions_delta) avg_etime_s,?
sql.buffer_gets_delta/decode(sql.executions_delta,sql.executions_delta) avg_lio,????????????????
sql.disk_reads_delta/decode(sql.executions_delta,sql.executions_delta) avg_pio,?????????????????
(sql.cpu_time_delta/1000000)/decode(sql.executions_delta,sql.executions_delta) avg_cputime_s,???
sql.rows_processed_total/decode(sql.executions_delta,sql.executions_delta) avg_row??????????????
from dba_hist_sqlstat sql,dba_hist_snapshot s?????????????????????????????????????????????????????????????
where sql.instance_number =(select instance_number from v$instance)????????????????????????????????????????
and sql.dbid =(select dbid from v$database)????????????????????????????????????????????????????????????????
and s.snap_id = sql.snap_id????????????????????????????????????????????????????????????????????????????????
and sql_id = trim(‘&sql_id‘) order by s.snap_id desc)??????????????????????????????????????????????????????
where rownum <= 100;???????????????????????????????????????????????????????????????????????????????????????

Enter value for sql_id: 66a4184u0t6hn
old  16: and sql_id = trim(‘&sql_id‘) order by s.snap_id desc)
new  16: and sql_id = trim(‘66a4184u0t6hn‘) order by s.snap_id desc)

  SNAP_ID DATE_TIME                        PLAN_HASH EXECUTIONS  etime/exec  buffer/exec diskread/exec cputim/exec rows/exec
--------- ------------------------------ ----------- ---------- ----------- ------------ ------------- ----------- ---------
       39 08/16/19_1500_1600              2214001748          1         .12        25839          2901         .10    173927
       39 08/16/19_1500_1600              4122059633          3         .11        13992           847         .11    173927


3. 绑定执行计划

(编辑:吕梁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读