【轉】Oracle 執行計劃(Explain Plan) 說明

轉自:http://blog.chinaunix.net/uid-21187846-id-3022916.htmlhtml

      若是要分析某條SQL的性能問題,一般咱們要先看SQL的執行計劃,看看SQL的每一步執行是否存在問題。 若是一條SQL平時執行的好好的,卻有一天忽然性能不好,若是排除了系統資源和阻塞的緣由,那麼基本能夠判定是執行計劃出了問題。看懂執行計劃也就成了SQL優化的先決條件。這裏的SQL優化指的是SQL性能問題的定位,定位後就能夠解決問題。web

查看執行計劃的三種方法

  • 設置autotrace(非通用)sql

序號工具

命令oop

解釋性能

1優化

SET AUTOTRACE OFFui

此爲默認值,即關閉Autotrace spa

2.net

SET AUTOTRACE ON EXPLAIN

只顯示執行計劃

3

SET AUTOTRACE ON STATISTICS

 只顯示執行的統計信息

4

SET AUTOTRACE ON

 包含2,3兩項內容

5

SET AUTOTRACE TRACEONLY

 ON類似,但不顯示語句的執行結果

  • 使用SQL
EXPLAIN PLAN FOR sql語句;
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));
或者select * from table(dbms_xplan.display);
  • 使用Toad,PL/SQL Developer工具

Cardinality(基數)/ rows

Cardinality值表示CBO預期從一個行源(row source)返回的記錄數,這個行源多是一個表,一個索引,也多是一個子查詢。 在Oracle 9i中的執行計劃中,Cardinality縮寫成Card。 在10g中,Card值被rows替換。

Cardinality的值對於CBO作出正確的執行計劃來講相當重要。 若是CBO得到的Cardinality值不夠準確(一般是沒有作分析或者分析數據過舊形成),在執行計劃成本計算上就會出現誤差,從而致使CBO錯誤的制定出執行計劃。

對於多表查詢,CBO使用每一個關聯表返回的行數(Cardinality)決定用什麼樣的訪問方式來作表關聯(如Nested loops Join 或 hash Join)。

多表鏈接的三種方式詳解 HASH JOIN /MERGE JOIN/ NESTED LOOP

http://blog.csdn.net/tianlesoftware/archive/2010/08/20/5826546.aspx

SQL 的執行計劃

Oracle SQL的硬解析和軟解析

http://blog.csdn.net/tianlesoftware/archive/2010/04/08/5458896.aspx

示例:

SQL> SET AUTOTRACE TRACEONLY; -- 只顯示執行計劃,不顯示結果集

SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;

image

在Toad 裏面,很清楚的顯示了執行的順序。 可是若是在SQLPLUS裏面就不是那麼直接。 但咱們也能夠判斷:通常按縮進長度來判斷,縮進最大的最早執行,若是有2行縮進同樣,那麼就先執行上面的

字段解釋:

  1. ID: 一個序號,但不是執行的前後順序。執行的前後根據縮進來判斷。
  2. Operation: 當前操做的內容。
  3. Rows: 當前操做的Cardinality,Oracle估計當前操做的返回結果集。
  4. Cost(CPU):Oracle 計算出來的一個數值(代價),用於說明SQL執行的代價。
相關文章
相關標籤/搜索