【DB笔试面试600】在Oracle中,如何获取SQL历史执行计划?
- 2019 年 10 月 10 日
- 笔记
♣
题目部分
在Oracle中,如何获取SQL历史执行计划?
♣
答案部分
历史执行计划只能从AWR中获取,如果AWR没有记录的话,那么就无法获取历史执行计划了,获取历史执行计划的命令如下所示:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&sqlid'));
对于历史计划,可以生成SQL报告,命令如下所示:
SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(L_DBID => , L_INST_NUM => , L_BID => , L_EID => , L_SQLID => )) ;
其中,L_DBID代表数据库的DBID,L_INST_NUM代表数据库的实例号,单机环境为1,RAC环境填写具体的实例号,L_BID为开始的快照号,L_EID为结束的快照号,L_SQLID为要查看SQL的SQL_ID。
下面的例子可以直接从AWR中获取SQL_ID为“bsa0wjtftg3uw”的执行计划,可以看到历史有2种执行计划,一个是全表扫描,一个是索引范围扫描:
SYS@RAC2LHR1> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(SQL_ID => 'bsa0wjtftg3uw' )) ; SQL_ID bsa0wjtftg3uw -------------------- SELECT file# FROM file$ WHERE ts#=:1 Plan hash value: 690176192 ----------------------------------------------- | Id | Operation | Name | ----------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID| FILE$ | | 2 | INDEX RANGE SCAN | I_FILE2 | ----------------------------------------------- Note ----- - rule based optimizer used (consider using cbo) SQL_ID bsa0wjtftg3uw -------------------- SELECT file# FROM file$ WHERE ts#=:1 Plan hash value: 3494626068 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | | 1 | TABLE ACCESS FULL| FILE$ | 1 | 6 | 2 (0)| 00:00:01 | --------------------------------------------------------------------------- 31 rows selected.
本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。