ORACLE執行計劃

shilei1發表於2011-05-02

1.什麼叫做執行計劃?
一個SQL語句表示你想要從中得到的結果,但是資料庫伺服器收到這條SQL的時候,一開始並不是馬上解析它,如果這條SQL沒有語法錯誤,資料庫伺服器才會繼續工作,並且選擇最好的計算方式,如果你是查詢一張表的話,伺服器會選擇一下是讀取整張表呢還是利用索引,那種執行效率好就會選擇哪種!最終SQL語句被物理性執行的方法被稱作執行計劃!
一個執行計劃由若干基本操作組成,負責處理或計算出最優的執行計劃的DB 元件叫做最佳化器,最佳化器是建立在其所在的DB資源的基礎上進行工作的。
資料庫伺服器在執行SQL語句之前會定製幾套執行計劃!看哪個執行計劃消耗的系統資源少就用哪套執行計劃!被資料庫伺服器執行的那套執行計劃就叫做SQL語句的執行計劃!

2.不借助第三方工具,怎樣檢視SQL的執行計劃?

首先,建立一個叫做Plustrace的角色,具體建立過程如下:

因為我的裝在E盤下,所以在路徑E:\oracle\product\10.1.0\Db_1\sqlplus\admin的目錄下找到plustrce.sql檔案,檔案內容自己可以以記事本的方式開啟看。然後以員的身份登入到SQL命令視窗,在命令視窗執行該檔案 SQL> @ E:\oracle\product\10.1.0\Db_1\sqlplus\admin\plustrce.sql 效果如下:

SQL> drop role plustrace;

角色已刪除。

SQL> create role plustrace;

角色已建立。

SQL>
SQL> grant select on v_$sesstat to plustrace;

授權成功。

SQL> grant select on v_$statname to plustrace;

授權成功。

SQL> grant select on v_$mystat to plustrace;

授權成功。

SQL> grant plustrace to dba with admin option;

授權成功。

SQL>
SQL> set echo off

當然,你可以將該角色的許可權授予給其他使用者
其次,建立一個plan_table表,用來儲存分析SQL語句的結果,可以在路徑 E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN下找到 utlxplan.sql,這個檔案就是用來建立plan_table表的SQL語句。

create table PLAN_TABLE (
statement_id varchar2(30),
plan_id number,
timestamp date,
remarks varchar2(4000),
operation varchar2(30),
options varchar2(255),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_alias varchar2(65),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns number,
id numeric,
parent_id numeric,
depth numeric,
position numeric,
cost numeric,
cardinality numeric,
bytes numeric,
other_tag varchar2(255),
partition_start varchar2(255),
partition_stop varchar2(255),
partition_id numeric,
other long,
distribution varchar2(30),
cpu_cost numeric,
io_cost numeric,
temp_space numeric,
access_predicates varchar2(4000),
filter_predicates varchar2(4000),
projection varchar2(4000),
time numeric,
qblock_name varchar2(30)
);

在SQL命令視窗中執行該檔案 SQL> @ E:\oracle\product\10.1.0\Db_1\RDBMS\ADMIN\utlxplan.sql這樣儲存分析SQL語句結果的表就建成了。如果現在在SQL命令視窗中執行一條SQL語句的話,我們會發現還是看不到執行計劃的!因為我們有幾個回顯引數沒有設定!

set time on; (說明:開啟時間顯示)
set autotrace on; (說明:開啟自動分析統計,並顯示SQL語句的執行結果)
set autotrace traceonly; (說明:開啟自動分析統計,不顯示SQL語句的執行結果)

所以我們在SQL命令視窗 set autotrace on 或 set autotrace traceonly 時,我們才能看到SQL語句的執行計劃和統計資訊!

例如在我的system使用者模式下有表員工表 e,我執行 SELECT * FROM SYSTEM.e ,將得到如下返回資訊:

EID ENAME SEX ID
---------- ---------- ---------- ----------
001 趙1 男 yy
002 錢2 男 02
003 孫3 男 03
004 李4 女 04
005 周5 女 55


執行計劃
----------------------------------------------------------
Plan hash value: 3822424092

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5 | 185 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| E | 5 | 185 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------


統計資訊
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
784 bytes sent via SQL*Net to client
373 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-694272/,如需轉載,請註明出處,否則將追究法律責任。

相關文章