実行計画のTIPS データベースコンサルタントのノウハウちょい見せ

Oracle RDBMSなどのオラクル製品や各種インフラ技術(OS、ストレージ、ネットワーク)といった話題を取り上げます。著者は小田圭二、「門外不出のOracle現場ワザ」、「絵で見てわかるOracleの仕組み」、「絵で見てわかるOS/ストレージ/ネットワーク」などの著作もあります

ホーム > スポンサー広告 > 実行計画のTIPSホーム > DBA > 実行計画のTIPS

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

実行計画のTIPS

今回は実行計画のTIPSです。統計情報のノウハウ(過去3~4回くらいまで)も併せてごらんください。

●効率よくチューニングする/問題を見つける

SQLをチューニング/問題を見つけるときは、コスト(※)が上がっている箇所を見ると、初心者はあたりをつけやすいです。コストが大きく上がっているところは、Oracleが「重い」と予測しているポイントだからです。

※:コストをstatspackから表示するのは2回前の記事参照

●バインドピーク※ その1

※:バインドピークとは、実行計画を作るにあたって、バインド変数(:aとか:b)の値をピーク(peek:覗く)ことです。バインド変数にセットされた値(1とか'a'とか)を参考にして実行計画を立てます。この機能はデフォルトでONです。

バインドピークによるトラブルが起こりやすいのは選択率です。選択率とは、表の中のどれくらいのデータが選ばれるのか?です。そのため範囲検索を使ったSQLでよくトラブルが起こります。範囲検索とは、< や > や betweenといった条件句のことです。もともと、統計情報を取得すると、その列のデータの最高値と最低値がとられます。たとえば1から始まる主キーで、最大値が1000であれば、その列の最高値は1000で最低値は1となります。ヒストグラムを使用しない場合、分布は均一と想定しますから、between 1 and 50だと、ざっと1/20が選ばれると考えます。ぱっと考えると、インデックスが効率的に見えます。しかし、実際のデータでは、1から50までに99%のデータが含まれていることもあります。すると、実際はフルスキャンが効率的かもしれません。

対策としては、ヒストグラムの使用も考えられますが、バインドピークを止めるのも手です。実は、バインドピークを止める(止める件は3回ほど前に書いてます)と、ある一定の選択率で計算するため、実行計画の変動を抑制できるからです。

●バインドピーク その2

バインドピークとパーティション機能の組み合わせも気をつけましょう。パーティション機能とは、表の内部を区切って、データメンテナンスしやすくしたり、競合を回避する機能のことです。
個々のパーティション単位で見ると、データが0件からスタートして膨大な件数になることもよくあります。例えば、1日ごとにパーティションにしている場合、毎日違うパーティションにデータを入れることになるでしょう。その場合、朝(データが少ない)ときは高速で、夜になる(データが多いと)低速ということが起こりえます。朝の段階で実行計画を立てて(例:フルスキャン)、それをそのまま使ってしまったりするからです。

これは統計情報を常に「データ件数が多い時点の統計情報」に固定しておくと防げたりします。また、バインドピークを止めると、デフォルトの一定の選択率となったりするため、実行計画の変動を防げることが多いです。

●バインドピーク その3

たとえば、1から100のデータはパーティション1、101から200まではパーティション2といった具合に、表の内部に複数のパーティションを作るとします。

そのパーティションを履歴データに使うことを考えます。最初のパーティションは、100まで入れるとします。100まで入ったので、次は2番目のパーティションに入れはじめました。このタイミングでselectの実行計画を立てるとします。その場合、表全体のデータが多くても、フルスキャンが選ばれるかもしれません。理由は、2番目のパーティションでデータ件数などを評価してしまうケースがあるからです。バインドピークにより、「どのパーティションか」ということも判断できます。そのため、このような実行計画が選ばれやすくなります。

フルスキャンという実行計画を立てたあと、そのselect文と同じSQLが1番目のパーティションにアクセスすると悲劇かもしれません。2番目のパーティションと違って、データ量が多いからです。このように、バインドピークとパーティション機能の組み合わせは統計情報の運用に気をつけた方がよいです。

これも統計情報をデータ件数が多い時点のものに固定しておくと防げたりします。バインドピークを止めると、パーティションの選択が行われなくなったり、一定の選択率となるため、この方法も効果があったりします。

●バインドピークなどによるexplain planの不確実さ

実行計画を表示させるためのコマンドとして有名なのが、explain planです。
explain plan for SQL文という簡単なコマンドで実行計画が表示されるため、愛用者は多いと思います。
しかし、explain planは、静的な情報のみで実行計画を表示します。そのため、バインド変数の値によって生成されるSQLが異なるような場合にはつかえません。たまたま初回のバインド変数の値がフルスキャン向きだったというケースの分析には向かないのです。つまり、当時の実行計画はどうだったかという分析にexplain planを使用すると、正しくないケースがあるのです。

explain planで表示すべきではないとすると、どうすべきかはこの次に。

スポンサーサイト
[ 2008/10/20 22:22 ] DBA | TB(0) | CM(0)
コメントの投稿













管理者にだけ表示を許可する
プロフィール

odakeiji

Author:odakeiji
小田圭二 日本オラクルのテクノロジーソリューションコンサルティング統括本部においてデータベースのコンサルタントをしている。今までのキャリアでは、社内教育部隊で、データベースやOS、ネットワークを教える経験を5年ほど積んだり、コンサル部門で主にDB(インフラ含む)のコンサルを10年程度経験した。また、コンサルタントとして、主に大規模ミッションクリティカルシステムを担当。社内では”火消し”とも呼ばれ、システムトラブルの火消しをいくつも担当していたこともある。
ポリシーは、「OracleもOS上で動くアプリケーションにすぎない。だから、OS、ストレージ、ネットワークを学ぶべき。アーキテクチャから考えろ」。
スキル面の興味は、アーキテクチャ、DBA、インフラ技術、教育、コンサル手法など。
本ブログのポリシーは「週に1回、DBAやインフラ担当者の役に立つ記事を書きたい」です(守れるだけ、守りたい・・・・)
なお、本ブログにおいて示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。ご了承ください。

私の主な著書の紹介です。もしよかったら、お役立てください。他にもオライリーなどがあります

●「絵で見てわかるOS/ストレージ/ネットワーク データベースはこう使っている」小田圭二 著
私のポリシーである”DBMSもOSの動くアプリケーションに過ぎない”に基づいて、OSとDBMSの関係、ストレージとDBMSの関係、ネットワークとDBMSの関係、を解説した珍しい書籍です。DBを学んでひと段落したら、DB使いもインフラ全体を意識しなければなりませんが、そのような人にお勧めです。企業ユーザー向けのIT本としては、2008年度翔泳社No1だとか(最後は出版社談)。

●「絵で見てわかるOracleの仕組み」 小田圭二 著
教育に携わる者としての私の思い「丸暗記するな。アーキテクチャを知るべき。絵で説明すべき」を具体化した、Oracleの入門書です。Oracle初心者向きですが、Oracleの基礎となる部分の動きを解説しているため、バージョンに依存せずに何年先でも使えます。逆に、本書の内容を理解せずに、ひたすら丸暗記すると応用力が身につきません。この本を読むだけで何かできるようになるわけではありませんが、アーキテクチャを身につけて、本当の技術力を身につける第一歩として欲しいと思っています。

●「44のアンチパターンに学ぶDBシステム」 小田圭二 著
本書は、企業のDBシステムの設計/構築から運用管理、プロジェクト管理までの各フェーズにおけるトラブル(失敗)事例について、アンチパターン(べからず集)とその回避策/防止策として解説するものです。チェックリストとして使っていただいても構いません。分かっていてもアンチパターンは避けられないことも多いものです(政治とか)。そういう方には、同じ仲間は多いのだなと再認識していただくための一服の清涼剤としていただければと思います。

●「門外不出のOracle現場ワザ」 小田圭二 他 著
一番最初に出た本です。結構とがった内容を扱っています。
・パフォーマンス分析の考え方(私の担当)
・性能テストや障害テストの仕方、設計の注意点(主に私が執筆)
・コストベースオプティマイザ(10gベース)のアーキテクチャ
・コネクションプーリング
最新のOracleの内容は含んでいませんが、今でも性能の考え方やオプティマイザの考え方は使えるはずです。オプティマイザをここまで解説している本を私は知りません。

●「続・門外不出のOracle現場ワザ」 小田圭二 他 著
「続」の名前の通り、次に出た本です。ちょっと尖り過ぎたかもしれません^^; でも本当に使う内容を選んだつもりです。一流になりたい・他の人と差をつけたい人にお勧めでしょうか。
・性能の良いSQLの書き方
・文字化けの仕組み
・障害(特に性能やハング)の分析・対応方法(私が執筆)
・障害をリアルタイムに分析・対処する方法(私が執筆)
・オプティマイザの使い方ノウハウ
・アップグレードのノウハウ

●「データベース」小田圭二 他 著
私にしては堅い本です。なんせ、共同執筆者が大御所の國友義久先生です。階層型DBMS、ネットワーク型DBMS、リレーショナル型DBMS、XMLDBMS、OO(オブジェクト指向)DBMS、DBMSの持つ機能、DBMSのセキュリティ、データベースの著作権、監査、モデリング、正規化といった内容を網羅しており、深い記述は無いものの、DB技術全体を抑えるのに向いている一冊です。ある程度技術力がついたエンジニアの方が、DB全体を振り返りたい(勉強したい)というときの最初の1冊としてお勧めです。



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。