溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

快速得到SQL帶A-Time時(shí)間的執(zhí)行計(jì)劃的小技巧

發(fā)布時(shí)間:2020-08-06 17:09:43 來(lái)源:ITPUB博客 閱讀:235 作者:yhluffy 欄目:關(guān)系型數(shù)據(jù)庫(kù)

快速得到SQL帶A-Time時(shí)間的執(zhí)行計(jì)劃的小技巧

使用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í),最好不要使用,

此方法只作為小技巧,需要看具體情況去判斷是否使用該方法。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI