フィルタ述語とアクセス述語 (実行計画の読み方#3)

さて、これまでで、実行計画のツリーのたどり方と、ツリーの構成要素である各オペレーションで 実行されている処理の概要がわかったと思います。

しかし、これだけの情報では、実行計画と実行されたSQLのWHERE条件を対応づけて理解することは 難しいです。(できなくはありませんが、かなり推測に頼る形になります。)

SQLのWHERE条件と対応付けるためには、フィルタ述語とアクセス述語に着目する必要があります。

### Predicate Informationセクション

実行計画をDBMS_XPLAN.DISPLAY_CURSORで取得した場合、フィルタ述語とアクセス述語に関する情報は Predicate Informationセクションに表示されます。

—————————————————————————————– | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | —————————————————————————————– | 0 | SELECT STATEMENT | | | | 20 (100)| | | 1 | NESTED LOOPS | | 10 | 40120 | 20 (0)| 00:00:01 […]

オペレーションの一覧と最低限覚えておくべきオペレーション (実行計画の読み方#2)

先のエントリの説明で、実行計画をいわば「形式的には読める(*1)」ようにはなりました。 しかし、実行計画が何をやっているのかという、意味的な観点では「理解できていない」はずです。 実行計画の処理内容を理解するためには、実行計画を構成するオペレーションの処理内容を理解する 必要があります。

* (*1) 「たどれる」という表現のほうが近いかもしれませんが・・・

### オペレーションの一覧

Oracle Databaseには非常に多くのオペレーションが存在し、 大部分のオペレーションについては、マニュアルの以下の箇所で説明されています。

* [10.2](http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19207-02/ex_plan.htm#59155) * [11.1](http://otndnld.oracle.co.jp/document/products/oracle11g/111/doc_dvd/server.111/E05743-02/ex_plan.htm#sthref1154) * [11.2](http://download.oracle.com/docs/cd/E16338_01/server.112/b56312/ex_plan.htm#i23461)

### 最低限覚えておくべきオペレーション

全てのオペレーションに関して説明することは、現実的でないため、 先のエントリで説明した実行計画に含まれるオペレーションを説明します。 なお、このエントリに含まれるオペレーションは、非常に多くの実行計画で使用されうる、 非常に重要なものであり、最低限覚えておく必要があります。

—————————————————————————————– | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | —————————————————————————————– | 0 | SELECT STATEMENT | | | | 20 (100)| | | […]

JPOUGに参加させていただきました!

インサイトテクノロジーの新久保さんの想いに共感し、[Japan Oracle User Group – JPOUG](http://www.jpoug.org/) にメンバーとして参加させていただきました!

Oracle Database Userのみなさんに役立つ活動を行っていきたいと思います! 何かご意見がありましたら、twitterやblogのコメント欄で頂戴できればうれしいです!

実行計画のツリーのたどり方 (実行計画の読み方#1)

これまでのエントリに記載してきたように、実行計画は階層的なツリー構造で表現 されます。 本エントリでは、実行計画の読み方のfirst stepとして、 実際の処理順序に即したツリー構造のたどり方を説明します。

SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL, NULL, ‘LAST’));

PLAN_TABLE_OUTPUT ——————————————————————————————— SQL_ID dvv5bah5b4k51, child number 1 ————————————- SELECT /*+ FULL(PA) INDEX(CH idx_chpa) USE_NL(CH) LEADING(PA) */ cid, cname, pa.pid, pname FROM ch, pa WHERE ch.pid = pa.pid and pa.pid = 1

Plan hash value: 3514264536

—————————————————————————————– | Id | […]

実行計画の読み方

これまでのエントリで、DBMS_XPLAN.DISPLAY_CURSORをつかってV$SQL_PLAN から実行計画を取得する方法をオススメしてきました。 この方法は、手軽であり、かつ、SQLトレースやEXPLAIN PLANの問題点に対処できる 優れた方法であることがお分かりいただけたかと思います。

しかし、当たり前の話ですが、実行計画を取得できたとしても、読めなければ意味がありません。 このため、取得した実行計画の読み方をこれからいくつかのエントリで説明したいと思います。

以下の構成で進める予定です。(エントリ記載次第、リンクを張る予定)

* [実行計画のツリーのたどり方](http://www.csus4.net/d/2011/06/20/traverse_plan_tree/) * [オペレーションの一覧と最低限覚えておくべきオペレーション](http://www.csus4.net/d/2011/06/30/operations/) * [フィルタ述語とアクセス述語](http://www.csus4.net/d/2011/06/30/predicate/ ) * 結合の動作イメージとオペレーション

自身の経験上、実行計画の読み方は一度の説明で理解しにくいようです。 このため、一連のエントリでは、わざと同じようなことを何度も繰り返し説明するような 形にしています。