您好,登錄后才能下訂單哦!
使用spool把結(jié)果輸出到文件,然后直接去文件查看執(zhí)行計(jì)劃即可
得到帶時(shí)間的執(zhí)行計(jì)劃的方法有兩種:
1、在會(huì)話設(shè)置參數(shù)statistics_level=all
alter session set statistics_level=all; 執(zhí)行SQL select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
2、在語(yǔ)句中使用hint(/*+ gather_plan_statistics */),然后查出這個(gè)SQL的SQL_ID,然后再去查詢執(zhí)行計(jì)劃
執(zhí)行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 */%'; 查看執(zhí)行計(jì)劃 select * from table(dbms_xplan.display_cursor('sql_id',null,'allstats'));
以上的兩種方式都可以得到帶時(shí)間的執(zhí)行計(jì)劃。
但是用這樣的方式去查看執(zhí)行計(jì)劃,有一個(gè)弊端:必須等到SQL語(yǔ)句的全部的記錄在屏幕輸出,然后才可以查看執(zhí)行計(jì)劃。
為了不需要等待SQL執(zhí)行完,然后才可以查看執(zhí)行計(jì)劃;以及不需要在屏幕輸出SQL的執(zhí)行結(jié)果刷屏,
可以采用把SQL的結(jié)果以及執(zhí)行計(jì)劃輸出到文件,然后去文件查看執(zhí)行計(jì)劃。
!??!注意:?。。?/span>
使用spool把結(jié)果輸出到文件,是把查詢結(jié)果輸出到文件,包含真實(shí)的數(shù)據(jù),因此需要慎重考慮,
是否可以采取這樣的方式進(jìn)行查詢。
測(cè)試:
需要查看一條SQL的帶時(shí)間的執(zhí)行計(jì)劃
方法1、
設(shè)置會(huì)話參數(shù) alter session set statistics_level=all; 執(zhí)行SQL select /*+ index(t1 idx_t1_c1) */* from t1 where c1 <= 90000; 需要等待執(zhí)行完SQL,然后才可以查詢 查看執(zhí)行計(jì)劃 select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
方法2、
執(zhí)行帶hint的SQL select /*+ gather_plan_statistics index(t1 idx_t1_c1) */* from t1 where c1 <= 90000; 需要等待執(zhí)行完SQL 查詢?cè)揝QL對(duì)應(yīng)的SQL_ID select sql_id,sql_text from v$sql where sql_text like '%/*+ gather_plan_statistics */%'; 查看執(zhí)行計(jì)劃(根據(jù)這條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 ----------- 參數(shù)解釋: set line 200 pages 999 設(shè)置輸出格式 set timing on設(shè)置時(shí)間 set termout off設(shè)置不讓腳本的內(nèi)容在屏幕輸出 spool /home/oracle/test.txt 打開(kāi)spool;并且設(shè)置輸出文件的位置以及名稱 spool off關(guān)閉spool,否則會(huì)一直把sqlplus里的內(nèi)容寫道test.txt文件中 登錄到sqlplus sqlplus / as sysdba (或者執(zhí)行該SQL的用戶) 執(zhí)行該腳本 @/home/oracle/test.txt 查看文件中的執(zhí)行計(jì)劃 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
等執(zhí)行完畢去查看該文件即可,在文件最低端可以看到執(zhí)行計(jì)劃,省去了中間刷屏的時(shí)間,
但是產(chǎn)生了一個(gè)帶有數(shù)據(jù)的文件,當(dāng)記錄很多時(shí),最好不要使用,
此方法只作為小技巧,需要看具體情況去判斷是否使用該方法。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。