Oracleメモ > 実行計画の読み方(Oracle) 実行計画の読み方(Oracle) †【関連】 例として、従業員マスタ(EMP)、部門マスタ(DEPT)からデータを検索する場合の、実行計画の読み方を記載する。 0.準備 SQL*PLUSを起動し、以下のコマンドを発行する。 set linesize 1000 1.テーブル結合がない場合 - 索引を使用して任意の1件を取得する場合 テーブル結合を行わない場合の実行計画は、以下の通り表示される。 Operation 列で一番右側にインデントされている行が一番最初にアクセスされているデータとなる。 この実行計画は、以下の事を表している。 (A) emp表の索引(EMP_PK)を使って対象レコード(EMP_ID=5のレコード)のROWIDを取得する。 (B) 上記(A)で索引から取得した ROWID から実際のEMP表のデータを取得する。 2.テーブル結合がある場合 - 索引を使用したNESTED LOOP結合の場合 EMP表のIDが5のデータを取得する。(10万件中の1件) この実行計画は、以下の事を表している。 駆動表(外部表) は EMP表 である。 (A) まず、emp表の索引を使ってEMP表の対象レコード(EMP_ID=5のレコード)のROWIDが取得される。 (B) 上記(A)で索引から取得した ROWIDから、EMP表の実際のデータを取得する。 (C) 上記(A,B)で取得したEMP表のDEPT_IDを使用して、DEPT表の索引からDEPT表の対象データのROWIDが取得される。 (E) 次に、上記までに取得したDEPT表のROWIDを使用して、DEPT表の実際のデータを取得する。 3.テーブル結合がある場合 - ハッシュ結合の場合 EMP表のIDが90000より大きいデータを取得する。(10万件中の1万件) この実行計画は、以下の事を表している。 駆動表(外部表) は DEPT表 である。 (A) DEPT表が全表検索(フルスキャン)され、結合条件列(DEPT_ID)にハッシュ関数をかけた後、メモリ上にハッシュテーブルが作成される。 (B) EMP表の索引からEMP表の対象データ(EMP_ID > 90000のレコード)のROWIDが取得される。 (C) 上記(B)で取得したEMP表のROWIDから、EMP表の実際のデータが取得される。 (D) 上記(A)と(C)で取得したデータの結合が行われる。 もう少し詳細に書くと、 3-X.もしハッシュ結合されるケースを無理やり索引スキャンしたら 上記の ハッシュ結合のケースでは、DEPT表の索引が使用されていない。 ここでは、オプティマイザヒントを使用して、上記のケースを無理矢理、索引を使用したネステッドループ結合した場合に まず、オプティマイザが算出したコストを見ると、100倍以上に増えている事が分かる。 ここでは、結合条件を指定するヒント句でアクセスパスを制御したが、ルールベースで動作させている時にも、これと同じ状況になる事がある。 |