副标题[/!--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. 绑定执行计划
(编辑:青岛站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|