ナレッジボックス

Pocket


一緒にまなぼ!「hiromi と楽しむOracleパフォーマンスチューニング!」【Vol.1 実行計画を見てみよう】

オラクル女子

 

こんにちわ〜はじめまして〜Oracle女子のhiromiですimage465

 

hiromiのことを先にちょっとだけ紹介させてね。あたし、

 

 

カワイイものすき〜image582

 

イケメンすき〜image582

 

みんなでワイワイするの大すき〜image582

 

 

な感じのふつ〜の女の子。でも、ITエンジニアなの。見えないってよく言われる。

 

でも、Oracleと出会って、DBが気になってきて・・・で、ER図描くのが好きになって〜って、自分でもウケる〜。

 

そんなあたしが、みんなのお役に立てたらなって思って、hiromiが知ってるOracleのパフォーマンスチューニング(ぱふぉちゅ)を教えるよ〜image517

 

hiromiと一緒に楽しくパフォチュしてみよ〜image576

SQL遅ぉ-い(泣)、と思ったら実行計画を見てみよう

作ったアプリケーションがなんか遅いな〜kame1なんて思って調べてみたらSQLが遅いせいだった!なんてことよくあるよね。

 

そういう場合はまずSQLの実行計画を見るの。そっこ〜見る!!実行計画は、どうやってどんな順番でデータを読みに行くのかっていう道すじを表してくれるもののことね。

 

SQLの実行計画を見るには3つの方法があるんだけど

  • 1.AUTOTRACE機能
  • 2.EXPLAIN PLAN文実行
  • 3.V$SQL_PLAN参照

 

だよ。すぐ使えちゃうから、試してみてね!!image465

 

 

 

いち

image1612AUTOTRACE機能image1612

 

Oracleの機能にはAUTOTRACE機能っていうのがあるの。おーととれーすnewimageneru8

 

で、これがなにかっていうと、SQLの実行計画を集める機能なの。SQL*Plusなんかで「SET AUTOTRACE」っていうコマンドを実行すると使えるんだけど、そのあとに実行したSQLの実行計画が自動的に出力されるようになるんだよ。ちょ〜便利〜image578

 

 

 

 

オプションがいくつかあるんだけど、それぞれの意味を書いておくね。ぶっちゃけ、「SET AUTOTRACE ON」だけ覚えてたら十分見れるんだけどね〜image1601

 ◆SET AUTOTRACE ON
  実行結果表示の後に、実行計画と統計情報の両方を表示

 ◆SET AUTOTRACE ON EXPLAIN
  実行結果表示の後に、実行計画のみ表示

 ◆SET AUTOTRACE ON STATISTICS
  実行結果表示の後に、統計情報のみ表示

 ◆SET AUTOTRACE TRACEONLY
  実行結果を表示せず、実行計画と統計情報を表示

このSET AUTOTRACEコマンド、気をつけなきゃいけないのは、実際にSQLも実行されちゃうってこと。だから、DELETE文の実行計画を確認したい場合にはちょっと不向きかなぁ。せっかく入れたデータが消えちゃった-(爆泣)!!ってことになっちゃう。

 

でも、簡単で覚えやすいから1番おすすめ〜image527

 

 

 

に

image1612EXPLAIN PLAN文image1612

 

実行次はEXPLAIN PLANだよ。

 

さっきのAUTOTRACE機能は、実際にSQLが実行されちゃってDELETE文のとき困るよね。どうすりゃいいの〜ってときに使えるのがEXPLAIN PLANimage582

 

じゃあ実行の仕方を教えちゃうよ〜image1687

 

 

これでこのSQLの実行計画が出力されるの。でも、長くて覚えるのたいへんだよね〜・・・

 

だから、hiromiも使うときメモったの見たり、調べなおしたりしちゃう(笑)EXPLAIN PLANは、AUTOTRACE機能と違って解析したSQL1回ぽっきりの出力で終了。その代わり、1回解析したSQLは、さっきの実行方法2行目のSELECT文を実行すればEXPLAIN PLAN文を打たなくても見れるからね。

 

実際に実行したらこんな感じに出力されるよpiyo1

 スクリーンショット 2013-06-19 10.07.05

 

 

さん

image1612V$SQL_PLAN参照image1612

 

最後はV$SQL_PLAN。

 

V$ってなんだろね?よくわかんないけど、Oracleが用意してくれいてる便利なビューはV$という文字で始まるみたいだよ。ちなみに動的パフォーマンスビューっていうらしいよ。どうてきぱふぉーまんすびゅうimage516V$はぶいだらー。このV$で始まるビューはほかにもいろいろあってどれも便利で使えるヨ!!

 

じゃあ、V$SQL_PLANってどんなビューかっていうと、ハードパースされたSQLの実行計画を一気に確認できる表なの。ハードパースって、OracleがSQLを解析することね。

SQLを実行するときって、まず最初にSQLを解析して実行できるかどうか、どう実行するのかを考えて、その解析結果とか実行計画をライブラリキャッシュっていう箱に入れておくの。それで、次に同じSQLを実行しようとしたときには、この箱から出して使うの。ハードパースするのに時間くっちゃうからね、同じSQLだったら解析する手間を省いて、はやく結果を返してあげられるってことね。

 

Oracle賢い〜やさしい〜!!newimageneru9

 

賢くてやさしいOracle君のイメージを描いたら、こんな感じかな。

 

SCN_0003

 

イメージつかめてもらえたかなぁ?

 

ライブラリキャッシュっていう箱がある共有プールってのは、Oracleのなかにあるメモリのお話だよ。
みんなで一緒に使うものをためておくところだから「共有プール」って名前っぽいよね、hiromiも知らないけど〜image517

 

それで、ハードパースしたSQLの実行計画はV$SQL_PLANを検索すると見れるんだけどね、実際にV$SQL_PLANを全件参照してみた結果サンプルを見てみて。

 

png;base6466c268812f4e7716

 

なんだこれ〜〜〜〜〜、うーん、、、って、よくわかんないよねimage465

 

結局、V$SQL_PLANだけ見ても、どのSQLのものなのかわからないのが正直なところ。解析済みのSQLの解析結果が全部入ってるからね。だから、どのSQLの実行計画か知るためには、先にV$SQLっていうビューから実行計画を見たいSQLのSQL_IDっていうキーを拾っておかないといけないんだよね。

 

なんか、これだけ聞くとV$SQL_PLANとか見るの面倒くさいし、使わなくてよくない?って思うけど、ちゃんと出番があるんだよ〜image527

 

実際にそのDBを使ってるアプリケーションが実行したSQLの実行計画を見たいってときには、コレしかないんだよね。今までの2つの方法は、SQL*Plusなんかで直接SQLを実行するときに見る方法だからね。

 

それとね、アプリケーションが動いてたくさんのSQLが実行されたなかから、全表走査(テーブルの全レコードを読み取ること)している実行計画を見つけて、そのSQLを探りあてたい!ってときとかV$SQL_PLANを見ることから始まるね。全表走査は、レコード数が多いとその分読み取るのに時間がかかってしまうから、場合によっては良くなかったりするの。

 

実行計画を見る3つの方法の説明はここまでだけど、そういえば実行計画の見方を教えてなかったねnewimageneru8

 

実行計画で確認する項目にアクセスパスがあって、OPERATIONってところに(V$SQL_PLANは、OPTIONS列も)「TABLE ACCESS FULL」とか「UNIQUE SCAN」とか書いてるよね。これが「データをどうやって検索するかー?」ってことなの。アクセスパスにはいろんな種類があって、さっき話に出てきた’全表走査’ってのもコレでわかるってこと。「TABLE ACCESS FULL」ってのが、それだよ〜image516

 

ほかにもインデックスとテーブルのアクセスパスがあるから挙げておくね。

【インデックス】
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

じゃあ今日はこのへんでおしまいimage1601

 

次回は「Vol.2 Statspackを見てみよう」でね!ばいばぁ〜いkaerup


Pocket

お問合せ

開発に関するご相談/各種お問合せは下記まで。

TEL.06-4806-3470 月曜~金曜(祝日を除く)10:00~18:00
contact-dev@kronos-jp.net

技術情報

  • ナレッジボックス
グリーンハンド
STA-LOG
クロノスラボ
採用