一緒にまなぼ!「hiromi と楽しむOracleパフォーマンスチューニング!」【Vol.1 実行計画を見てみよう】
こんにちわ〜はじめまして〜Oracle女子のhiromiです
hiromiのことを先にちょっとだけ紹介させてね。あたし、
な感じのふつ〜の女の子。でも、ITエンジニアなの。見えないってよく言われる。
でも、Oracleと出会って、DBが気になってきて・・・で、ER図描くのが好きになって〜って、自分でもウケる〜。
そんなあたしが、みんなのお役に立てたらなって思って、hiromiが知ってるOracleのパフォーマンスチューニング(ぱふぉちゅ)を教えるよ〜
hiromiと一緒に楽しくパフォチュしてみよ〜
SQL遅ぉ-い(泣)、と思ったら実行計画を見てみよう
作ったアプリケーションがなんか遅いな〜なんて思って調べてみたらSQLが遅いせいだった!なんてことよくあるよね。
そういう場合はまずSQLの実行計画を見るの。そっこ〜見る!!実行計画は、どうやってどんな順番でデータを読みに行くのかっていう道すじを表してくれるもののことね。
SQLの実行計画を見るには3つの方法があるんだけど
- 1.AUTOTRACE機能
- 2.EXPLAIN PLAN文実行
- 3.V$SQL_PLAN参照
だよ。すぐ使えちゃうから、試してみてね!!
Oracleの機能にはAUTOTRACE機能っていうのがあるの。おーととれーす
で、これがなにかっていうと、SQLの実行計画を集める機能なの。SQL*Plusなんかで「SET AUTOTRACE」っていうコマンドを実行すると使えるんだけど、そのあとに実行したSQLの実行計画が自動的に出力されるようになるんだよ。ちょ〜便利〜
1 |
SQL> SET AUTOTRACE {ON | TRACEONLY | OFF} [EXPLAIN] [STATISTICS] |
オプションがいくつかあるんだけど、それぞれの意味を書いておくね。ぶっちゃけ、「SET AUTOTRACE ON」だけ覚えてたら十分見れるんだけどね〜
実行結果表示の後に、実行計画と統計情報の両方を表示
◆SET AUTOTRACE ON EXPLAIN
実行結果表示の後に、実行計画のみ表示
◆SET AUTOTRACE ON STATISTICS
実行結果表示の後に、統計情報のみ表示
◆SET AUTOTRACE TRACEONLY
実行結果を表示せず、実行計画と統計情報を表示
このSET AUTOTRACEコマンド、気をつけなきゃいけないのは、実際にSQLも実行されちゃうってこと。だから、DELETE文の実行計画を確認したい場合にはちょっと不向きかなぁ。せっかく入れたデータが消えちゃった-(爆泣)!!ってことになっちゃう。
でも、簡単で覚えやすいから1番おすすめ〜
実行次はEXPLAIN PLANだよ。
さっきのAUTOTRACE機能は、実際にSQLが実行されちゃってDELETE文のとき困るよね。どうすりゃいいの〜ってときに使えるのがEXPLAIN PLAN
じゃあ実行の仕方を教えちゃうよ〜
1 2 |
SQL> explain plan for [解析したいSQL] SQL> select plan_table_output from table(dbms_xplan.display()); |
これでこのSQLの実行計画が出力されるの。でも、長くて覚えるのたいへんだよね〜・・・
だから、hiromiも使うときメモったの見たり、調べなおしたりしちゃう(笑)EXPLAIN PLANは、AUTOTRACE機能と違って解析したSQL1回ぽっきりの出力で終了。その代わり、1回解析したSQLは、さっきの実行方法2行目のSELECT文を実行すればEXPLAIN PLAN文を打たなくても見れるからね。
実際に実行したらこんな感じに出力されるよ
最後はV$SQL_PLAN。
V$ってなんだろね?よくわかんないけど、Oracleが用意してくれいてる便利なビューはV$という文字で始まるみたいだよ。ちなみに動的パフォーマンスビューっていうらしいよ。どうてきぱふぉーまんすびゅうV$はぶいだらー。このV$で始まるビューはほかにもいろいろあってどれも便利で使えるヨ!!
じゃあ、V$SQL_PLANってどんなビューかっていうと、ハードパースされたSQLの実行計画を一気に確認できる表なの。ハードパースって、OracleがSQLを解析することね。
SQLを実行するときって、まず最初にSQLを解析して実行できるかどうか、どう実行するのかを考えて、その解析結果とか実行計画をライブラリキャッシュっていう箱に入れておくの。それで、次に同じSQLを実行しようとしたときには、この箱から出して使うの。ハードパースするのに時間くっちゃうからね、同じSQLだったら解析する手間を省いて、はやく結果を返してあげられるってことね。
Oracle賢い〜やさしい〜!!
賢くてやさしいOracle君のイメージを描いたら、こんな感じかな。
イメージつかめてもらえたかなぁ?
ライブラリキャッシュっていう箱がある共有プールってのは、Oracleのなかにあるメモリのお話だよ。
みんなで一緒に使うものをためておくところだから「共有プール」って名前っぽいよね、hiromiも知らないけど〜
それで、ハードパースしたSQLの実行計画はV$SQL_PLANを検索すると見れるんだけどね、実際にV$SQL_PLANを全件参照してみた結果サンプルを見てみて。
なんだこれ〜〜〜〜〜、うーん、、、って、よくわかんないよね
結局、V$SQL_PLANだけ見ても、どのSQLのものなのかわからないのが正直なところ。解析済みのSQLの解析結果が全部入ってるからね。だから、どのSQLの実行計画か知るためには、先にV$SQLっていうビューから実行計画を見たいSQLのSQL_IDっていうキーを拾っておかないといけないんだよね。
なんか、これだけ聞くとV$SQL_PLANとか見るの面倒くさいし、使わなくてよくない?って思うけど、ちゃんと出番があるんだよ〜
実際にそのDBを使ってるアプリケーションが実行したSQLの実行計画を見たいってときには、コレしかないんだよね。今までの2つの方法は、SQL*Plusなんかで直接SQLを実行するときに見る方法だからね。
それとね、アプリケーションが動いてたくさんのSQLが実行されたなかから、全表走査(テーブルの全レコードを読み取ること)している実行計画を見つけて、そのSQLを探りあてたい!ってときとかV$SQL_PLANを見ることから始まるね。全表走査は、レコード数が多いとその分読み取るのに時間がかかってしまうから、場合によっては良くなかったりするの。
実行計画を見る3つの方法の説明はここまでだけど、そういえば実行計画の見方を教えてなかったね
実行計画で確認する項目にアクセスパスがあって、OPERATIONってところに(V$SQL_PLANは、OPTIONS列も)「TABLE ACCESS FULL」とか「UNIQUE SCAN」とか書いてるよね。これが「データをどうやって検索するかー?」ってことなの。アクセスパスにはいろんな種類があって、さっき話に出てきた’全表走査’ってのもコレでわかるってこと。「TABLE ACCESS FULL」ってのが、それだよ〜
ほかにもインデックスとテーブルのアクセスパスがあるから挙げておくね。
UNIQUE SCAN
RANGE SCAN
~ DESCENDING
FULL SCAN
~ DESCENDING
FAST FULL SCAN
FULL
BY ROWID RANGE
BY USER ROWID
BY INDEX ROWID
BY GLOBAL INDEX ROWID
BY LOCAL INDEX ROWID
CLUSTER
HASH
SAMPLE
SAMPLE BY ROWID RANGE
じゃあ今日はこのへんでおしまい
次回は「Vol.2 Statspackを見てみよう」でね!ばいばぁ〜い