oracle获取SQL语句的执行计划(转)

--你手动执行一遍的资源消耗成本不高,则可以

set long 9999
set line 250
set autotrace traceonly
<执行你的sql>
如果这个sql有绑定变量,则按下面例子样子改
var x number;
exec :x := 2;
select number  from  table1  where tbname = :x

 

--通过awr看到了sql_id,则可以

--1.从内存的share pool中提取执行计划

set long 9999
set line 250
select * from TABLE(dbms_xplan.display_cursor('SQL_ID'));

--2.从awr的历史执行计划表中提取

select * from table(dbms_xplan.display_awr('SQL_ID'));

--3.生成一个awrsql的报告

SQL> @?/rdbms/admin/awrsqrpt

在提示中输入你的sql_id

 

 

--flush 单个语句的执行计划

当你通过例如降低高水位+执行统计信息收集之后,但是执行计划还未改变,可以通过下列语句把原来的执行计划刷出内存,再重新执行一遍sql就好啦~

--先找出地址和hash值

select a.sql_text,a.version_count,a.executions,a.address,a.hash_value from v$sqlarea a where a.sql_id='apkqt0cs3tmkz';

--执行flush

exec sys.dbms_shared_pool.purge('&address,&hash_value','c');

 

posted @ 2016-12-27 15:07  当年亦如是  阅读(638)  评论(0)    收藏  举报