执行计划
查询之前执行过的语句的执行计划(并非上一条语句,而是相隔了一段时间,但没有被shared_pool age out,准确度高)
1.先查询这条语句的sql_id和child_number,后面会用到
set line 200 pagesize
col sql_text for a80
select sql_text,sql_id,child_number from v$sql where sql_text like 'select * from ft.t1 where id=100';
2.使用上一步得到的结果查询执行计划
select * from table(dbms_xplan.display_cursor('afksjfksjk13',0,'Advanced'));
查看执行计划:
explain plan for
select JZ,pk_poundbill,companyname,vvehicle,dgrosstime,materialname,nnet,vbillcode from v_itf_zcinfo_ajj where companyname='山东金岭化工股份有限公司';
select * from table(dbms_xplan.display)
select * from user_ind_columns where table_name = upper('gl_voucher');
create index I_LEVM_POUNDBILL_001 ON LEVM_POUNDBILL(NNET,TS,VDEF18,NBILLSTATUS) tablespace NNC_INDEX01 NOLOGGING;
dba_tables里的num_rows, last_analyzed列
然后再select count(*)一下实际行数,看和num_rows相差大不
select num_rows,last_analyzed from dba_tables where table_name='FA_CARDHISOTYR';
方法1:查询上一条语句的执行计划(执行完语句紧接着查看执行计划,准确度高)
先执行一条语句
select * from ft.t1 where id=200;
查询执行计划
select * from table(dbms_xplan.display_cursor(null,null,'ALL'));
方法2:查询之前执行过的语句的执行计划(并非上一条语句,而是相隔了一段时间,但没有被shared_pool age out,准确度高)
1.先查询这条语句的sql_id和child_number,后面会用到
set line 200 pagesize
col sql_text for a80
select sql_text,sql_id,child_number from v$sql where sql_text like 'select * from ft.t1 where id=100';
2.使用上一步得到的结果查询执行计划
select * from table(dbms_xplan.display_cursor('afksjfksjk13',0,'Advanced'));
方法3:查询执行时间过久已经被shared_pool age out,无法使用上面两种方法查询时(需要知道SQL_ID,准确度高);
select * from table(dbms_xplan.display_awr('0g95zffxhaj06'));
或
@?/rdbms/admin/awrsqrpt.sql
方法4:在session级别设置set trace(准确度低)
set autotrace on ;显示sql查询结果和执行计划
set autotrace traceonly;只显示执行计划,不显示SQL查询结果(适合查询结果特别多的情况)
方法5:set event 10046和tkprof(最准确)
1.生成sql分析的trace file
oradebug setmypid
oradebug event 10046 trace name context forever,level 12
执行要分析的sql
oradebug tracefile_name
2.使用tkprof分析生成的tracefile
tkprof /u01/app/oracle/diag/rdbms/sdbd/SBDB1/trace/SBDB1_ora_23692.trc
执行后会在当前目录下生成可读性良好的分析结果文件
查看历史执行计划:
1.先查找sql id
select se.sid,se.username,se.machine,sq.cpu_time,sq.sql_text,se.sql_id from v$process p,v$session se,v$sqlarea sq where p.addr=se.paddr and se.sql_hash_value=sq.hash_value and p.spid='&pid';
8b9ngza9bddwv
2.通过以下sql 能查出对应sql_id 的历史执行计划及变化时间:
select distinct SQL_ID,
PLAN_HASH_VALUE,
to_char(TIMESTAMP, 'yyyymmdd hh24:mi:ss') TIMESTAMP
from dba_hist_sql_plan
where SQL_ID = '8b9ngza9bddwv'
order by TIMESTAMP;
3.通过以下sql 能查出执行计划哪些地方出现了变化:
col options for a15
col operation for a20
col object_name for a20
select distinct SQL_ID,
PLAN_HASH_VALUE,
to_char(TIMESTAMP, 'yyyymmdd hh24:mi:ss') TIMESTAMP
from dba_hist_sql_plan
where SQL_ID = '8b9ngza9bddwv'
order by TIMESTAMP;

浙公网安备 33010602011771号