プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • SQL
  • 【SQL】実行計画を調べるEXPLAIN PLANコマンドの使い方(Oracle、MySQ…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【SQL】実行計画を調べるEXPLAIN PLANコマンドの使い方(Oracle、MySQL)

05.03

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

実行計画の見方

どのDBMSでも共通項目

  • 操作対象のオブジェクト(MySQLなら「table」)
  • オブジェクトに対する操作の種類(MySQLなら「type」)
  • 操作対象となるレコード数(MySQLなら「row」)

EXPLAIN PLAN FORコマンドとは

実行時に、オプティマイザが立てたSQLの実行計画を観察するツールです。

「実行計画」について分からない方は、下記の記事をご参照下さい。

【SQL】実行計画、実行計画変動リスクなど

Oracle:EXPLAIN PLAN FORコマンドの使い方

1.PLAN_TABLEテーブルの作成(最初のみ)

まず、EXPLAIN PLANコマンドは、SQLの実行計画を「PLAN_TABLE」というテーブルに格納します。

なので、最初に「PLAN_TABLEテーブル」というテーブルを作成する必要があります。

なお、一度作成したら、以後は作成する必要はないです。

まずは、「%ORACLE_HOME%\rdbms\admin\utlxplan.sql」ファイルのSQLを該当のスキーマに対して実行します。

SQL実行後、「PLAN_TABLE」がスキーマ内に作成されています。

2.SQL実行計画を保存する。

下記の構文を実行します。

1
EXPLAIN PLAN FOR <SQL>

ためしに実行してみます。

実行すると、上記のように表示されました。

3.PLAN_TABLEテーブルから、SQL実行計画を抽出します。

そのまま、「PLAN_TABLE」のデータを読み取るのは大変なので、下記のSQLを実行して、結果を整形しましょう。

1
2
3
4
5
6
7
SELECT LPAD(' ',2*LEVEL) ||
RTRIM(OPERATION) || ' ' ||
RTRIM(OPTIONS) || ' ' ||
RTRIM(OBJECT_NAME) AS EXECUTION_PLAN
FROM PLAN_TABLE
CONNECT BY PRIOR id = parent_id
START WITH ID = 0

実行結果

この結果では、「USER_MASTER」テーブルに対して、フルテーブルスキャンでアクセスしていることがわかります。

MySQL

実行計画の基本的な読み方

  • 入れ子の深い操作ほど先に実行される。(深いテーブルに先にアクセスが行われる。)

フルテーブルスキャン

1
EXPLAIN select * from テーブル名;

typeに「ALL」と記述されていたらフルテーブルスキャンになります。インデックスが使われていない状態になります。

インデックススキャン

1
EXPLAIN SELECT * FROM テーブル名 WHERE xxx_id = 'XXX';

typeに「const」と記述されていたらインデックススキャンになります。インデックスが使われていて最速です。

結合の実行計画

1
2
3
EXPLAIN SELECT カラム名
  FROM テーブル1 S INNER JOIN テーブル2 R
    ON S.id1 = R.id1;

MySQLの結合はNested Loop結合だけになります。片方のテーブルではtypeに「ALL」が使われて、もう片方のテーブルは「eq_ref」(インデックススキャンのようなもの、JOINに使われる。)が使われます。

サブクエリの種類

MySQLのサブクエリはよく遅いと言われます。実行計画のselect_typeを見れば分かります。

  • SUBQUERY
  • DEPENDENT SUBQUERY
  • DERIVED

結論から言えば遅いのは「DEPENDENT SUBQUERY」になります。

SUBQUERY

DEPENDENT SUBQUERY

相関サブクエリ、MySQLにおいては外部のクエリから評価されて内部のクエリが評価される仕様になっているので、N✖️M回もの計算が行われることになってしまいます。

DERIVED

スポンサーリンク
  • 2018 05.03
  • miyabisan2
  • コメントを書く
  • Oracle, SQL
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2018 04.30

    【SQL】内部処理の仕組み(Oracle)

  2. 2021 10.24

    【SQL】「ON句」の意外と知らない活用法

  3. 2018 05.20

    【PL/SQL】条件分岐

  4. 2018 05.27

    【Oracleアーキテクチャ】「REDOログファイル」、「REDOログバッファ」について

  5. 2018 05.20

    【PL/SQL】「変数」や「固定値」の使い方

  6. 2021 10.30

    【SQL】INとEXISTS、JOINの違い

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【SQL】ヒント句について

【システム開発】ログ出力の意義

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー