使用spool把结果输出到文件,然后直接去文件查看执行计划即可
得到带时间的执行计划的方法有两种:
1、在会话设置参数statistics_level=all
alter session set statistics_level=all; 执行SQL select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
2、在语句中使用hint(/*+ gather_plan_statistics */),然后查出这个SQL的SQL_ID,然后再去查询执行计划
执行SQL select /*+ gather_plan_statistics */ count(*) from test; 查询SQL的SQL_ID select sql_id,sql_text from v$sql where sql_text like '%/*+ gather_plan_statistics */%'; 查看执行计划 select * from table(dbms_xplan.display_cursor('sql_id',null,'allstats'));
以上的两种方式都可以得到带时间的执行计划。
但是用这样的方式去查看执行计划,有一个弊端:必须等到SQL语句的全部的记录在屏幕输出,然后才可以查看执行计划。
为了不需要等待SQL执行完,然后才可以查看执行计划;以及不需要在屏幕输出SQL的执行结果刷屏,
可以采用把SQL的结果以及执行计划输出到文件,然后去文件查看执行计划。
!!!注意:!!!
使用spool把结果输出到文件,是把查询结果输出到文件,包含真实的数据,因此需要慎重考虑,
是否可以采取这样的方式进行查询。
测试:
需要查看一条SQL的带时间的执行计划
方法1、
设置会话参数 alter session set statistics_level=all; 执行SQL select /*+ index(t1 idx_t1_c1) */* from t1 where c1 <= 90000; 需要等待执行完SQL,然后才可以查询 查看执行计划 select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
方法2、
执行带hint的SQL select /*+ gather_plan_statistics index(t1 idx_t1_c1) */* from t1 where c1 <= 90000; 需要等待执行完SQL 查询该SQL对应的SQL_ID select sql_id,sql_text from v$sql where sql_text like '%/*+ gather_plan_statistics */%'; 查看执行计划(根据这条SQL的SQL_ID查询) select * from table(dbms_xplan.display_cursor('sql_id',null,'allstats'));
方法3、
先编写脚本
vi test.sql set line 200 pages 999 set timing on set termout off spool /home/oracle/test.txt alter session set statistics_level=all; select /*+ index(t1 idx_t1_c1) */* from t1 where c1 <= 90000; select * from table(dbms_xplan.display_cursor(null,null,'allstats last')); spool off ----------- 参数解释: set line 200 pages 999 设置输出格式 set timing on设置时间 set termout off设置不让脚本的内容在屏幕输出 spool /home/oracle/test.txt 打开spool;并且设置输出文件的位置以及名称 spool off关闭spool,否则会一直把sqlplus里的内容写道test.txt文件中 登录到sqlplus sqlplus / as sysdba (或者执行该SQL的用户) 执行该脚本 @/home/oracle/test.txt 查看文件中的执行计划 90000 rows selected. Elapsed: 00:00:25.90 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- SQL_ID caumajpb0jz24, child number 1 ------------------------------------- select /*+ index(t1 idx_t1_c1) */* from t1 where c1 <= 90000 Plan hash value: 4200789634 ------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | ------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 90000 |00:00:14.07 | 456K| 315K| | 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1 | 90001 | 90000 |00:00:14.07 | 456K| 315K| |* 2 | INDEX RANGE SCAN | IDX_T1_C1 | 1 | 90001 | 90000 |00:00:00.08 | 6187 | 0 | ------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("C1"<=90000) 19 rows selected. Elapsed: 00:00:00.08
等执行完毕去查看该文件即可,在文件最低端可以看到执行计划,省去了中间刷屏的时间,
但是产生了一个带有数据的文件,当记录很多时,最好不要使用,
此方法只作为小技巧,需要看具体情况去判断是否使用该方法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。