Soumettre la recherche
Mettre en ligne
Oracleの実行計画を読んでみよう! #dbts2017
•
16 j'aime
•
16,288 vues
Ryota Watabe
Suivre
db tech showcase 2017 tokyo 2017年9月7日(木) 14:30~15:20 入門者向けセミナー Oracleの実行計画を読んでみよう! の資料です。
Lire moins
Lire la suite
Données & analyses
Signaler
Partager
Signaler
Partager
1 sur 53
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Introduction of Oracle Database Architecture(抜粋版) - JPOUG Oracle Database入学式 ...
Ryota Watabe
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
Miki Shimogai
Vacuum徹底解説
Vacuum徹底解説
Masahiko Sawada
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
歩 柴田
SQL大量発行処理をいかにして高速化するか
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
統計情報のリセットによるautovacuumへの影響について(第39回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
問合せ最適化インサイド
問合せ最適化インサイド
Takahiro Itagaki
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
pg_walinspectについて調べてみた!(第37回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
Contenu connexe
Tendances
Oracle Databaseを用いて学ぶRDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Oracle Databaseを用いて学ぶRDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Ryota Watabe
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
NTT DATA OSS Professional Services
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
Ryota Watabe
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
NTT DATA Technology & Innovation
新機能によるデータベースシステムの改善ポイント
新機能によるデータベースシステムの改善ポイント
オラクルエンジニア通信
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
Yuto Hayamizu
SQLチューニング勉強会資料
SQLチューニング勉強会資料
Shinnosuke Akita
DDD 2016 DB 12c クエリー・オプティマイザ新機能活用と統計情報運用の戦略
DDD 2016 DB 12c クエリー・オプティマイザ新機能活用と統計情報運用の戦略
歩 柴田
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
Satoshi Yamada
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
NTT DATA Technology & Innovation
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
歩 柴田
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
Hironobu Suzuki
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
NTT DATA OSS Professional Services
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
歩 柴田
Oracle Integration Cloud 概要(20200507版)
Oracle Integration Cloud 概要(20200507版)
オラクルエンジニア通信
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析
Yohei Azekatsu
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Ryota Watabe
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
オラクルエンジニア通信
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
yoku0825
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Miki Shimogai
Tendances
(20)
Oracle Databaseを用いて学ぶRDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
Oracle Databaseを用いて学ぶRDBMSの基本 (抜粋版) - JPOUG Oracle Database入学式 2016
PostgreSQL: XID周回問題に潜む別の問題
PostgreSQL: XID周回問題に潜む別の問題
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
PostgreSQL 12は ここがスゴイ! ~性能改善やpluggable storage engineなどの新機能を徹底解説~ (NTTデータ テクノ...
新機能によるデータベースシステムの改善ポイント
新機能によるデータベースシステムの改善ポイント
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
SQLチューニング勉強会資料
SQLチューニング勉強会資料
DDD 2016 DB 12c クエリー・オプティマイザ新機能活用と統計情報運用の戦略
DDD 2016 DB 12c クエリー・オプティマイザ新機能活用と統計情報運用の戦略
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQLの実行計画を読み解こう(OSC2015 Spring/Tokyo)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQL14の pg_stat_statements 改善(第23回PostgreSQLアンカンファレンス@オンライン 発表資料)
iostat await svctm の 見かた、考え方
iostat await svctm の 見かた、考え方
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
PostgreSQLのリカバリ超入門(もしくはWAL、CHECKPOINT、オンラインバックアップの仕組み)
使ってみませんか?pg_hint_plan
使ってみませんか?pg_hint_plan
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
固定化か?最新化か?オプティマイザ統計の運用をもう一度考える。 -JPOUG Tech Talk Night #6-
Oracle Integration Cloud 概要(20200507版)
Oracle Integration Cloud 概要(20200507版)
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Standard Edition 2でも使えるOracle Database 12c Release 2オススメ新機能
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
Oracle Database 11g,12cからのアップグレード対策とクラウド移行 (Oracle Cloudウェビナーシリーズ: 2021年7...
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
SQLチューニング入門 入門編
SQLチューニング入門 入門編
Similaire à Oracleの実行計画を読んでみよう! #dbts2017
Oracle In-database-archiving ~Oracleでの論理削除~
Oracle In-database-archiving ~Oracleでの論理削除~
Daiki Mogmet Ito
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
Hideki Saito
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
Shinya Sugiyama
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
KAWANO KAZUYUKI
Control distribution of virtual machines
Control distribution of virtual machines
irix_jp
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
Shinya Sugiyama
MySQLのGIS機能とか超入門 ~MyNA会2018年7月
MySQLのGIS機能とか超入門 ~MyNA会2018年7月
sakaik
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
yoyamasaki
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
Shinya Sugiyama
Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0
Kaito Tonooka
InputMethodKit超入門
InputMethodKit超入門
Wataru Kimura
JOSUG 34th Meetup
JOSUG 34th Meetup
irix_jp
[Azure Antenna] クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~
[Azure Antenna] クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~
Shuichi Gojuki
MySQLに本格GIS機能がやってきた~MySQL8.0最新情報~@OSC2018北海道
MySQLに本格GIS機能がやってきた~MySQL8.0最新情報~@OSC2018北海道
sakaik
http2 最速実装 v2
http2 最速実装 v2
Yoshihiro Iwanaga
MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
Shinya Sugiyama
HTTP2 最速実装 〜入門編〜
HTTP2 最速実装 〜入門編〜
Kaoru Maeda
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
NTT DATA Technology & Innovation
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
Kohei KaiGai
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
歩 柴田
Similaire à Oracleの実行計画を読んでみよう! #dbts2017
(20)
Oracle In-database-archiving ~Oracleでの論理削除~
Oracle In-database-archiving ~Oracleでの論理削除~
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
沖縄オープンラボラトリ OpenStackハンズオンセミナー午後1
Locondo 20190215@ec tech_group
Locondo 20190215@ec tech_group
MariaDB Columnstore 使いこなそう
MariaDB Columnstore 使いこなそう
Control distribution of virtual machines
Control distribution of virtual machines
DB tech showcase_tokyo2018_LOCONDO
DB tech showcase_tokyo2018_LOCONDO
MySQLのGIS機能とか超入門 ~MyNA会2018年7月
MySQLのGIS機能とか超入門 ~MyNA会2018年7月
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQLとPostgreSQLの基本的なパラメータ比較
MySQLとPostgreSQLの基本的なパラメータ比較
Apuri she ji_gaido_teburushe_ji__v1.0
Apuri she ji_gaido_teburushe_ji__v1.0
InputMethodKit超入門
InputMethodKit超入門
JOSUG 34th Meetup
JOSUG 34th Meetup
[Azure Antenna] クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~
[Azure Antenna] クラウドで HPC ~ HPC 環境の構築から、アプリケーションの実行まで ~
MySQLに本格GIS機能がやってきた~MySQL8.0最新情報~@OSC2018北海道
MySQLに本格GIS機能がやってきた~MySQL8.0最新情報~@OSC2018北海道
http2 最速実装 v2
http2 最速実装 v2
MySQLとPostgreSQLの基本的な実行プラン比較
MySQLとPostgreSQLの基本的な実行プラン比較
HTTP2 最速実装 〜入門編〜
HTTP2 最速実装 〜入門編〜
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
PL/CUDA - Fusion of HPC Grade Power with In-Database Analytics
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
Plus de Ryota Watabe
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い - Database Lounge Tokyo #2
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い - Database Lounge Tokyo #2
Ryota Watabe
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
Ryota Watabe
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
Ryota Watabe
Introduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
Ryota Watabe
Corruption And Revive - db tech showcase 2013 特濃JPOUG
Corruption And Revive - db tech showcase 2013 特濃JPOUG
Ryota Watabe
OSS-DB Silver ポイント解説セミナー ~SQL編~ (PostgreSQL9.0)
OSS-DB Silver ポイント解説セミナー ~SQL編~ (PostgreSQL9.0)
Ryota Watabe
Analyzing Oracle Database hang issues using various diagnostics.
Analyzing Oracle Database hang issues using various diagnostics.
Ryota Watabe
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
Ryota Watabe
Oracle Database In Lock
Oracle Database In Lock
Ryota Watabe
Plus de Ryota Watabe
(9)
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い - Database Lounge Tokyo #2
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い - Database Lounge Tokyo #2
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
全社情報共有サイトへのAlfresco Community 5 導入事例紹介 - 第27回Alfresco勉強会
Introduction of Oracle Database Architecture
Introduction of Oracle Database Architecture
Corruption And Revive - db tech showcase 2013 特濃JPOUG
Corruption And Revive - db tech showcase 2013 特濃JPOUG
OSS-DB Silver ポイント解説セミナー ~SQL編~ (PostgreSQL9.0)
OSS-DB Silver ポイント解説セミナー ~SQL編~ (PostgreSQL9.0)
Analyzing Oracle Database hang issues using various diagnostics.
Analyzing Oracle Database hang issues using various diagnostics.
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
プロとしてのOracleアーキテクチャ入門 ~番外編~ @ Developers Summit 2009
Oracle Database In Lock
Oracle Database In Lock
Oracleの実行計画を読んでみよう! #dbts2017
1.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 1Copyright © 2017 CO-Sol Inc. All Rights Reserved. 2017年9月7日 株式会社コーソル 渡部 亮太 Oracle入門セミナー 実行計画を読んでみよう!
2.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 2 自己紹介+所属会社紹介 • 渡部 亮太(わたべ りょうた) – JPOUG 共同創設者、ボードメンバー – 日本に8名しかいないOracle ACEの一人 – 著書「Oracleの基本」9月22日発売! 「プロとしてのOracleアーキテクチャ入門[第2版]」 – ブログ「コーソルDatabaseエンジニアのBlog」 http://cosol.jp/techdb/ • 株式会社コーソル – 「CO-Solutions=共に解決する」の理念のもと、Oracle技術に特 化した事業を展開中。心あるサービスの提供とデータベースエン ジニアの育成に注力している – 社員数: 132名 (2017年9月時点) – ORACLE MASTER Platinum 11g 取得者数 49名 ORACLE MASTER Platinum 12c 取得者数 35名 取得者数 日本 No.1 (おそらくWorld WideでNo.1) http://www.oracle.com/jp/education/omdata-171891-ja.html
3.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 3 技術者育成の取り組み [コーソル紹介] ORACLE MASTER Platinum取得者数 国内No1! 充実した教育+支援制度で技術者育成に力を入れています!
4.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 4 製品サービス 弊社ソリューションについて [コーソル紹介] 独自のサービスと製品を掛け合わせ、データベースの運用を 強力に支援致します。 &
5.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 5 [宣伝・告知] DB移行セミナーやります • 9月13日(水) 19:00-20:30 • https://connpass.com/event/63720/ • 技術領域: Oracle Database / Attunity
6.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 6 本セミナーについて • 比較的シンプルなSQLの実行計画を題材にして、Oracle Databaseの実行計画の読み方を学びます • Oracle Database初級者~中級者向けのセミナーです。 が、純粋な講義形式にしても眠くなるだけ :-P なので、 すこし対話形式のエッセンスを入れながら進めたいと思います • 途中で、実行計画を読むにあたって、落とし穴になりがちな点 についても説明します • 質問は随時Welcomeです。質疑応答が盛り上がったほうが、 みんなの理解が深まるはず! • 読みやすさ・理解しやすさのため、掲載するSQLや実行計画は 実際のもの から適宜 加工・修正しています • 同様の理由で、記述・説明の網羅性を犠牲にしているため、 キチンと理解したい場合は、マニュアルを参照してください
7.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 7 Agenda • 実行計画とは • 実行計画の取得方法 (見積ベース or 過去の実行) • ツリー構造のたどり方(実行計画の実行順序) • 基本的なオペレーションを理解する • 処理の流れをイメージできるようにする • 統計値の解釈(見積値 or 実測値、累積、 starts)
8.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 8Copyright © 2017 CO-Sol Inc. All Rights Reserved. 実行計画とは
9.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 9 実行計画とは • 実行計画は、SQLがOracleで実行される手順を示す • 実行計画はコストベースオプティマイザ(CBO; Cost- Based Optimizer)が作成する – CBOはOracleの内部コンポーネント – オプティマイザ統計が最新でないと適切な実行計画が作成され ないことに注意 • 不適切な実行計画でSQLが実行されると、本来であれば 実現できる処理パフォーマンスを得られない --------------------------------------------------------------------- | Id | Operation | Name | Rows |...| Time | --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | |...| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 |...| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 16 |...| 00:00:01 | ---------------------------------------------------------------------
10.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 10 実行計画に含まれる情報 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------- SQL_ID 3hrvf65nm048d, child number 0 ------------------------------------- SELECT * from tab0 WHERE col_idx = 'A' Plan hash value: 2195618789 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 7 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 | 32160 | 7 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 16 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') ツリー構造をしたステップ 各ステップの統計値 補足情報 ステップ 実行計画の実行手順における実行要素 親子関係がある ←SQL文 sql_id: SQL文の識別子(Oracleが自動的に付与) ←実行計画のハッシュ値 ※:取得方法によって、情報が表示される/され ないが異なる点に注意
11.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 11 実行計画の確認方法 確認方法 実行 計画 統計 値 備考 a EXPLAIN PLAN + DBMS_XPLAN.DISPLAY 見積 見積 SQLは実行されない b SQL実行 → DBMS_XPLAN.DISPLAY_CURSOR 実行 見積 c STATISTICS_LEVEL=ALLでSQL実行 → DBMS_XPLAN.DISPLAY_CURSOR (format=>'ALLSTATS LAST') 実行 見積 実行 見積統計と実行統計 の両方を表示 • 実行計画の正確性の観点から、 DBMS_XPLAN.DISPLAY_CURSOR を使う方法(b,c)がオススメ – 共有プール(キャッシュ領域)から実行計画および統計値を取得 • EXPLAN PLAN(a)もお手軽で便利!だけど、参考用途に 見積: Oracleが見積もった(予測した)実行計画または統計値を表示 実行: 過去のSQL実行で実際に使われた実行計画または統計値を表示
12.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 12 a) EXPLAIN PLAN + DBMS_XPLAN.DISPLAY SQL> EXPLAIN PLAN FOR SELECT * FROM tab0 WHERE col_idx = 'A'; 解析されました。 SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); PLAN_TABLE_OUTPUT ---------------------------------------------------------------------------------------------------- Plan hash value: 2195618789 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 16 | 32160 | 7 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 | 32160 | 7 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 16 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') 14行が選択されました。
13.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 13 b) SQL実行 → DBMS_XPLAN.DISPLAY_CURSOR SQL> set serveroutput off SQL> SELECT * from tab0 WHERE col_idx = 'A'; (略) SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR); PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------------- SQL_ID 3hrvf65nm048d, child number 0 ------------------------------------- SELECT * from tab0 WHERE col_idx = 'A' Plan hash value: 2195618789 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 7 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 | 32160 | 7 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 16 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') 19行が選択されました。 sql_idの指定を省略すると直近実行した SQLの実行計画を表示 ただし set serveroutput onだとうまく 動かないことに注意
14.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 14 c) DBMS_XPLAN.DISPLAY_CURSOR (format=>'ALLSTATS LAST') SQL> set serveroutput off SQL> ALTER SESSION SET statistics_level=ALL; SQL> SELECT * from tab0 WHERE col_idx = 'A'; (略) SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'ALLSTATS LAST')) PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------------- SQL_ID 3hrvf65nm048d, child number 0 ------------------------------------- SELECT * from tab0 WHERE col_idx = 'A' Plan hash value: 2195618789 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 16 |00:00:00.01 | 10 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 16 | 16 |00:00:00.01 | 10 | |* 2 | INDEX RANGE SCAN | T0_IDX | 1 | 16 | 16 |00:00:00.01 | 3 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') 19行が選択されました。 LASTを指定しない と複数実行の平均値 になることに注意 実行統計(A-xxx:Actual)が表示される ※: ここではE-Rowsのみが見積統計
15.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 15Copyright © 2017 CO-Sol Inc. All Rights Reserved. 単一テーブルアクセスの オペレーション
16.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 16 オペレーションとは PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------------- SQL_ID 3hrvf65nm048d, child number 0 ------------------------------------- SELECT * from tab0 WHERE col_idx = 'A' Plan hash value: 2195618789 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 7 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 | 32160 | 7 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 16 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') オペレーション 各ステップで実行される操作の種類 TABLE ACCESS FULL、 INDEX RANGE SCAN など ステップ 実行計画の実行手順における実行要素 親子関係がある
17.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 17 テーブルフルスキャン select * from tab0 where col_noix = 'A' -------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 9 (100)| | |* 1 | TABLE ACCESS FULL| TAB0 | 16 | 32160 | 9 (0)| 00:00:01 | -------------------------------------------------------------------------- 1 - filter("COL_NOIX"='A') TABLE ACCESS FULL filter
18.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 18 インデックス経由のテーブルアクセス(一意) select * from tab0 where id = '1'; --------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 2010 | 1 (0)| 00:00:01 | |* 2 | INDEX UNIQUE SCAN | PK_TAB0 | 1 | | 0 (0)| | --------------------------------------------------------------------------------------- 2 - access("ID"=1) INDEX UNIQUE SCAN TABLE ACCESS BY INDEX ROWID access
19.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 19 インデックス経由のテーブルアクセス(範囲) select * from tab0 where col_idx = 'A'; ------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | | | 7 (100)| | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 16 | 32160 | 7 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | IDX0 | 16 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------ 2 - access("COL_IDX1"='A') INDEX RANGE SCAN TABLE ACCESS BY INDEX ROWID access
20.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 20Copyright © 2017 CO-Sol Inc. All Rights Reserved. 実行計画のツリー構造
21.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 21 実行計画のツリー構造 ---------------------------------- | Id | Operation | Name | ---------------------------------- | 0 | SELECT STATEMENT | | |* 1 | TABLE ACCESS FULL| TAB0 | ---------------------------------- オペレーション 各ステップで実行される操作の種類 [オペレーションの例] TABLE ACCESS FULL INDEX RANGE SCAN ステップ 実行計画の実行手順における実行要素 親子関係がある ステップの親子関係 親は子から「行」を受け取る 2つ以上の子ステップを持つことがある(オペレーションの種類による) 0: SEL 1: TAF Rows 親 子
22.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 22 ツリー構造のたどり方 • インデントが深いところから見てゆく(実行開始する) んだろうなぁ・・・という認識はあるかと思います が・・・ • [問題] 以下の実行計画で、(実質的に)最初に実行され るステップはどれでしょう? ---------------------------------------------------- | Id | Operation | Name | ---------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | |* 2 | TABLE ACCESS FULL | PA | | 3 | TABLE ACCESS BY INDEX ROWID | CH | |* 4 | INDEX RANGE SCAN | IDX_CHPA | ---------------------------------------------------- a b c
23.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 23 ツリー構造を整理 ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | |* 2 | TABLE ACCESS FULL | PA | | 3 | TABLE ACCESS BY INDEX ROWID| CH | |* 4 | INDEX RANGE SCAN | IDX_CHPA | ------------------------------------------------- 0: SEL 1: NL 2: TAF 3: TAIR 4: IRS
24.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 24 ツリー構造のたどり方 • 最上位からインデントが深い方向にたどってゆく • 同じインデントのステップがある場合、表形式表示で上のステップを先 に実行する • それよりインデントが深いステップがなくなったら、表形式表示で下の ステップに移動する。ない場合は浅いインデント ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | |* 2 | TABLE ACCESS FULL | PA | | 3 | TABLE ACCESS BY INDEX ROWID| CH | |* 4 | INDEX RANGE SCAN | IDX_CHPA | ------------------------------------------------- 0: SEL 1: NL 2: TAF 3: TAIR 4: IRS
25.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 25 ツリー構造のたどり方 0: SEL 1: NL 2: TAF 3: TAIR 4: IRS 1. 最上位から親→子方向にたどってゆく 2. 複数の「子ステップ」がある場合、表形式表示で上にある「子ステッ プ」に進む 3. そのステップから、さらに親→子方向にたどってゆく 4. 最下位の「子ステップ」に到達したら、実行を開始する。 5. 実行終了したら、「親ステップ」に戻る 6. その「親ステップ」に、他の「子ステップ」がある場合、表形式表示で 上にある「子ステップ」に進み、3. へ ない場合、その「親ステップ」を実行し、その「親ステップ」の「さら に親のステップ」に戻り、6.を繰り返す
26.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 26 というわけで正解は • かならずしも、最も深いインデントのステップから実行されるわけでは ないことに注意 – きちんとした説明が面倒だからか・・・ 誤った情報が結構流布されている ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | |* 2 | TABLE ACCESS FULL | PA | | 3 | TABLE ACCESS BY INDEX ROWID| CH | |* 4 | INDEX RANGE SCAN | IDX_CHPA | ------------------------------------------------- 0: SEL 1: NL 2: TAF 3: TAIR 4: IRS 最初に 実行
27.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 27Copyright © 2017 CO-Sol Inc. All Rights Reserved. テーブルの結合と実行計画
28.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 28 結合とは EMPNO ENAME … DEPTNO 1001 本山三郎 2 1002 中村次郎 2 1003 山田花子 1 1004 三田海子 3 1005 山本太郎 1 1006 山田一朗 1 DEPTNO DNAME TELNO 1 金融部 0312345678 2 流通部 0312345679 3 公共部 0312345670 4 特別部 0312345677 EMPNO ENAME DNAME 1001 本山三郎 流通部 1002 中村次郎 流通部 1003 山田花子 金融部 1004 三田海子 公共部 1005 山本太郎 金融部 1006 山田一朗 金融部 [結合条件] emp.deptno = dept.deptno empテーブル (従業員) deptテーブル (部署) [SQL] SELECT empno, ename, dname FROM emp JOIN dept ON emp.deptno = dept.deptno;
29.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 29 結合の種類と実行計画 ネステッドループ結合 ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS BY INDEX ROWID| PA | |* 3 | INDEX UNIQUE SCAN | PK_PA | | 4 | TABLE ACCESS BY INDEX ROWID| CH | |* 5 | INDEX RANGE SCAN | IDX_CHPA | ------------------------------------------------- ソートマージ結合 ------------------------------------ | Id | Operation | Name | ------------------------------------ | 0 | SELECT STATEMENT | | | 1 | MERGE JOIN | | | 2 | SORT JOIN | | |* 3 | TABLE ACCESS FULL| T1 | |* 4 | SORT JOIN | | | 5 | TABLE ACCESS FULL| T2 | ------------------------------------ ハッシュ結合 ------------------------------------------ | Id | Operation | Name | ------------------------------------------ | 0 | SELECT STATEMENT | | |* 1 | HASH JOIN | | | 2 | TABLE ACCESS FULL | DEPARTMENTS | | 3 | TABLE ACCESS FULL | EMPLOYEES | ------------------------------------------ • 結合データ量=小で選択されやすい • 通常インデックスとともに使われる • Oracleのバージョンにより細かい違いが ある • 結合データ量=大で選択されやすい • 通常テーブルフルスキャンとともに使われる • 結合条件が等価結合でのみ選択される • 選択されるケースは少なめ
30.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 30Copyright © 2017 CO-Sol Inc. All Rights Reserved. ネステッドループ結合の 実行計画を読んでみる
31.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 31 実行計画を読む手順 1. インデント表形式からツリー構造をイメージ 2. ツリー構造の実行順序を理解 3. オペレーションと実行順序から、各ステップの処理内容 をイメージ ※:1. 2. は先行して説明済み
32.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 32 今回とりあげる実行計画 SQL_ID byzfsqntmu2h5, child number 0 ------------------------------------- SELECT /*+ 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: 1035406045 ------------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | ------------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 10 |00:00:00.09 | 15 | 14 | | 1 | NESTED LOOPS | | 1 | 10 | 10 |00:00:00.09 | 15 | 14 | | 2 | TABLE ACCESS BY INDEX ROWID| PA | 1 | 1 | 1 |00:00:00.04 | 2 | 2 | |* 3 | INDEX UNIQUE SCAN | PK_PA | 1 | 1 | 1 |00:00:00.02 | 1 | 1 | | 4 | TABLE ACCESS BY INDEX ROWID| CH | 1 | 10 | 10 |00:00:00.05 | 13 | 12 | |* 5 | INDEX RANGE SCAN | IDX_CHPA | 1 | 10 | 10 |00:00:00.01 | 3 | 2 | ------------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("PA"."PID"=1) 5 - access("CH"."PID"=1) 詳しい人向けの補足 12cから導入された最適化機能Batch table access by rowidをOFFにした実行計画
33.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 33 1. インデント表形式からツリー構造をイメージ ---------------------------------------------------------- | Id | Operation | Name | Starts | ---------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | NESTED LOOPS | | 1 | | 2 | TABLE ACCESS BY INDEX ROWID| PA | 1 | |* 3 | INDEX UNIQUE SCAN | PK_PA | 1 | | 4 | TABLE ACCESS BY INDEX ROWID| CH | 1 | |* 5 | INDEX RANGE SCAN | IDX_CHPA | 1 | ---------------------------------------------------------- 3 - access("PA"."PID"=1) 5 - access("CH"."PID"=1) 0: SEL 1: NL 2: TAIR 4: TAIR 5: IRS 3: IUS
34.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 34 2. ツリー構造の実行順序を理解 ---------------------------------------------------------- | Id | Operation | Name | Starts | ---------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 | NESTED LOOPS | | 1 | | 2 | TABLE ACCESS BY INDEX ROWID| PA | 1 | |* 3 | INDEX UNIQUE SCAN | PK_PA | 1 | | 4 | TABLE ACCESS BY INDEX ROWID| CH | 1 | |* 5 | INDEX RANGE SCAN | IDX_CHPA | 1 | ---------------------------------------------------------- 3 - access("PA"."PID"=1) 5 - access("CH"."PID"=1) 0: SEL 1: NL 2: TAIR 4: TAIR 5: IRS 3: IUS 最初に 実行
35.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 35 3. 各ステップの処理内容をイメージ INDEX RANGE SCAN TABLE ACCESS BY INDEX ROWID NL TABLE ACCESS BY INDEX ROWID INDEX UNIQUE SCAN ------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | NESTED LOOPS | | | 2 | TABLE ACCESS BY INDEX ROWID| PA | |* 3 | INDEX UNIQUE SCAN | PK_PA | | 4 | TABLE ACCESS BY INDEX ROWID| CH | |* 5 | INDEX RANGE SCAN | IDX_CHPA | ------------------------------------------------- 3 - access("PA"."PID"=1) 5 - access("CH"."PID"=1) PK_PA PA IDX_CHPA CH 0: SEL 1: NL 2: TAIR 4: TAIR 5: IRS 3: IUS
36.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 36Copyright © 2017 CO-Sol Inc. All Rights Reserved. 実行計画の統計値を理解する
37.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 37 実行計画 各ステップの統計値 • 各ステップの統計値が表示される – 統計値ごとに解釈が異なる : 下位ステップを含めた累積 or そのステップ単体 • 見積統計と実行統計の2種類がある SELECT * FROM tab0 WHERE col_idx = 'A' AND col_noix='B' -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | |* 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 2010 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 3 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- 1 - filter("COL_NOIX"='B') 2 - access("COL_IDX"='A') 各ステップの統計値
38.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 38 統計値とその解釈 統計値 解釈・意味 累積? Rows そのステップが上位のステップに返す見積行数 N Bytes そのステップが上位のステップに返すRowsの見積バイト数 N Cost そのステップ以下のステップの累積コスト コスト=平たく言うと「オラクルが予測した処理時間(単位なし)」 Y Time そのステップ以下のステップの予想処理時間 Y SELECT * FROM tab0 WHERE col_idx = 'A' AND col_noix='B' -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | | | 2 (100)| | |* 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 2010 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IDX | 3 | | 1 (0)| 00:00:01 | -------------------------------------------------------------------------------------- 1 - filter("COL_NOIX"='B') 2 - access("COL_IDX"='A') 0: SEL 1: TIR 2:IRS Rows=1 Rows=3
39.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 39 処理フローとRows統計 INDEX RANGE SCAN TABLE ACCESS BY INDEX ROWID t0_IDX TAB0 SELECT * from tab0 WHERE col_idx = 'A' AND col_noix='B' ------------------------------------------------------ | Id | Operation | Name | Rows | ------------------------------------------------------ | 0 | SELECT STATEMENT | | | |* 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | |* 2 | INDEX RANGE SCAN | T0_IDX | 3 | ------------------------------------------------------ 1 - filter("COL_NOIX"='B') 2 - access("COL_IDX"='A') filter access 0: SEL 1: TIR 2:IRS Rows=1 Rows=3
40.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 40 SQLチューニングとRows統計 • SQLチューニングの1つの指標 実行計画の早い段階で、データを絞り込む → 大量のデータを引き回す必要がなくなるので、処理の 高速化に寄与する • すなわち、Rows統計は小さい値であることが望ましい。 できれば、実行計画の早い段階で、小さい値にできるこ とが望ましい • ただ・・・「Rows統計」は見積統計であることに注意 実行統計である「A-Rows」を用いる方がより適切 (見積統計と実行統計については後述) • さらにもう一つ・・・(次ページ)
41.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 41 Rows統計の注意点 • 明らかにアクセスしたデータ量が異なるのに、 両方ともRows=1とは?? • Rowsはそのステップが上位ステップに引き渡す行数を示す SELECT * from t9 WHERE id = 1 ----------------------------------------------------- | Id | Operation | Name | Rows | ----------------------------------------------------- | 0 | SELECT STATEMENT | | | | 1 | TABLE ACCESS BY INDEX ROWID| T9 | 1 | |* 2 | INDEX UNIQUE SCAN | PK_T9 | 1 | ----------------------------------------------------- SELECT * from t9 WHERE id = 1 ------------------------------------------ | Id | Operation | Name | Rows | ------------------------------------------ | 0 | SELECT STATEMENT | | 1 | |* 1 | TABLE ACCESS FULL| T9 | 1 | ------------------------------------------ TABLE ACCESS FULL filterINDEX UNIQUE SCAN TABLE ACCESS BY INDEX ROWID access
42.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 42Copyright © 2017 CO-Sol Inc. All Rights Reserved. 見積統計と実行統計
43.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 43 実行計画確認方法と見積統計、実行統計 • 確認方法cでのみ、SQL実行における「本当の」統計値を 得られる • 確認方法a、bで得られる統計値は、あくまでも「Oracle が予測した」統計値であることに注意 確認方法 実行 計画 統計 備考 a EXPLAIN PLAN + DBMS_XPLAN.DISPLAY 見積 見積 SQLは実行されない b SQL実行 → DBMS_XPLAN.DISPLAY_CURSOR 実行 見積 c STATISTICS_LEVEL=ALLでSQL実行 → DBMS_XPLAN.DISPLAY_CURSOR (format=>'ALLSTATS LAST') 実行 見積 実行 見積統計と実行統計 の両方を表示
44.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 44 c) DBMS_XPLAN.DISPLAY_CURSOR (format=>'ALLSTATS LAST') SQL> ALTER SESSION SET statistics_level=ALL; SQL> SELECT * from tab0 WHERE col_idx = 'A'; (略) SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'ALLSTATS LAST')) PLAN_TABLE_OUTPUT --------------------------------------------------------------------------------------------------- SQL_ID 3hrvf65nm048d, child number 0 ------------------------------------- SELECT * from tab0 WHERE col_idx = 'A' Plan hash value: 2195618789 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 16 |00:00:00.01 | 10 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 16 | 16 |00:00:00.01 | 10 | |* 2 | INDEX RANGE SCAN | T0_IDX | 1 | 16 | 16 |00:00:00.01 | 3 | ------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("COL_IDX"='A') 19行が選択されました。
45.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 45 見積統計と実行統計 (E-xxxとA-xxx) ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | | 16 |00:00:00.01 | 10 | | 1 | TABLE ACCESS BY INDEX ROWID| TAB0 | 1 | 16 | 16 |00:00:00.01 | 10 | |* 2 | INDEX RANGE SCAN | T0_IDX | 1 | 16 | 16 |00:00:00.01 | 3 | ------------------------------------------------------------------------------------------------ 統計の種類 見積統計(E-xxx) Oracleが見積もった(予測した)統計値 実行統計 (A-xxx、Starts、 Buffersなど) 過去のSQL実行における実際の統計値
46.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 46 見積統計と実行統計が異なる例 SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'ALLSTATS LAST')); ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| T0 | 1 | 250 | 1 |00:00:00.01 | 4 | |* 2 | INDEX RANGE SCAN | T0_IX | 1 | 250 | 1 |00:00:00.01 | 3 | ----------------------------------------------------------------------------------------------- SQL> EXPLAIN PLAN FOR SELECT * FROM t0 WHERE col_idx = 'A'; SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); : ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 250 | 489K| 85 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T0 | 250 | 489K| 85 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IX | 250 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------- SQL> SELECT col_idx, count(*) FROM t0 GROUP BY col_idx; C COUNT(*) - ---------- A 1 B 1 C 1 X 997
47.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 47 見積統計と実行統計が異なることの意味 • Oracleが見積に失敗していることを示す • 対処策:より正確な見積ができるように、それを支援す る情報を追加する → オプティマイザ統計を改善する SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'ALLSTATS LAST')); ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| T0 | 1 | 250 | 1 |00:00:00.01 | 4 | |* 2 | INDEX RANGE SCAN | T0_IX | 1 | 250 | 1 |00:00:00.01 | 3 | -----------------------------------------------------------------------------------------------
48.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 48 オプティマイザ統計の改善による解決 SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(null, 't0', method_opt => 'FOR COLUMNS SIZE AUTO col_idx'); PL/SQLプロシージャが正常に完了しました。 SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(format=>'ALLSTATS LAST')); ----------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 4 | | 1 | TABLE ACCESS BY INDEX ROWID| T0 | 1 | 1 | 1 |00:00:00.01 | 4 | |* 2 | INDEX RANGE SCAN | T0_IX | 1 | 1 | 1 |00:00:00.01 | 3 | ----------------------------------------------------------------------------------------------- SQL> EXPLAIN PLAN FOR SELECT * FROM t0 WHERE col_idx = 'A'; SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); : ------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2007 | 2 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID| T0 | 1 | 2007 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | T0_IX | 1 | | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------- • ヒストグラムの収集で解決 • ヒストグラム=列値の頻度情報
49.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 49Copyright © 2017 CO-Sol Inc. All Rights Reserved. Starts実行統計
50.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 50 Starts実行統計 : オペレーションの実行回数 • 実行計画(見積)では表示されないが、実行計画を理解 する助けになるときがある SELECT cid, cname, pa.pid, pname FROM ch, pa WHERE ch.pid = pa.pid and pa.pid IN (1,2,3) ------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | ------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 3 | | 1 | NESTED LOOPS | | 1 | 3 | 3 | |* 2 | TABLE ACCESS FULL | CH | 1 | 3 | 3 | | 3 | TABLE ACCESS BY INDEX ROWID| PA | 3 | 1 | 3 | |* 4 | INDEX UNIQUE SCAN | PK_PA | 3 | 1 | 3 | ------------------------------------------------------------------------- 0: SEL 1: NL 2: TAF 4: TAIR 5: IUS Starts=3 → 3回実行
51.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 51 Starts実行統計 : オペレーションの実行回数 SELECT cid, cname, pa.pid, pname FROM ch, pa WHERE ch.pid = pa.pid and pa.pid IN (1,2,3) ------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | ------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 3 | | 1 | NESTED LOOPS | | 1 | 3 | 3 | |* 2 | TABLE ACCESS FULL | CH | 1 | 3 | 3 | | 3 | TABLE ACCESS BY INDEX ROWID| PA | 3 | 1 | 3 | |* 4 | INDEX UNIQUE SCAN | PK_PA | 3 | 1 | 3 | ------------------------------------------------------------------------- INDEX UNIQUE SCAN TABLE ACCESS BY INDEX ROWID NL TABLE ACCESS FULL CH PK_PA PA access ① ② ③ 0: SEL 1: NL 2: TAF 4: TAIR 5: IUS Starts=3 → 3回実行 ① ② ③ ① ② ③
52.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 52 Questions & Answers
53.
Copyright © 2017
CO-Sol Inc. All Rights Reserved. 53
Télécharger maintenant