SQL計画管理について データベースコンサルタントのノウハウちょい見せ

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

ホーム > スポンサー広告 > SQL計画管理についてホーム > DBA > SQL計画管理について

スポンサーサイト

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

SQL計画管理について

SQLの実行計画が変動して、トラブル発生・・・なんて経験ありませんか? 今日は実行計画の変動防止に効く、11gの新機能「SQL計画管理」についてです。

詳細情報は、Oracle Databaseパフォーマンス・チューニング・ガイド 11gリリース1 15章「SQL計画の管理の使用方法」にありますので、こちらも併せてご参照ください。

実行計画のトラブルのいやらしいところは、大抵の実行計画の変動は、プラスの効果なのにもかかわらず、ごく一部の変動がマイナス(大抵は過負荷)をもたらし、そのインパクトが大きいことです。つまり、防ぐのが難しいことです。

ポイント:
基本的に予防が目的の機能である。
1回だけ実行されたSQLなどは記録(固定化)の対象外である。
ベースラインという、実行計画を固定するためのメタ情報が使われる。
ベースラインの自動取得のためには、OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES初期化パラメータをTRUEに設定する。デフォルトはFALSE。
ベースラインを使用可能にするには、OPTIMIZER_USE_SQL_PLAN_BASELINES初期化パラメータをTRUEに設定する。デフォルトはTRUE。
デフォルトでは、一番最初に作られたベースラインが使われ続ける(正確には”ACCEPTED”となっているベースラインが使われる)。

●以下、試してみた結果です。

ベースライン未使用の場合(デフォルト動作):
1000行程度データを入れて、select text from testC where no < 1000 を2回実行。
-> フルスキャンだった。
30000行程度のデータに増やして、select text from testC where no < 1000 を2回実行。
-> インデックスアクセスになった。

データが30倍程度になっているため、インデックスが使用されるようになりました。良くある実行計画の変動です。

ベースライン使用の場合(OPTIMIZER_CAPTURE_SQL_PLAN_BASELINESをTRUEに変更):
1000行程度データを入れて、select text from testC where no < 1000 を2回実行。
-> フルスキャンだった。
30000行程度のデータに増やして、select text from testC where no < 1000 を2回実行。
-> フルスキャンのままだった。

ということで、データが30倍程度になっても、予定通り実行計画が固定されたままでした。

●ビューなどで調査してみました。

dba_sql_plan_baselinesビューでいろいろ管理情報を見ることができるそうです。

select sql_handle,sql_text, to_char(created,'YY/MM/DD HH24:MI:SS') created, plan_name, accepted from dba_sql_plan_baselines
where sql_text like 'select text from testC%';

以下実行結果です。

SYS_SQL_3c0d2d9b04210f89 select text from testC where no < 1000 09/03/29 20:27:49 SYS_SQL_PLAN_04210f89e64f159f NO
SYS_SQL_3c0d2d9b04210f89 select text from testC where no < 1000 09/03/29 20:27:00 SYS_SQL_PLAN_04210f89eca86bf0 YES

#実行計画が2つ存在し、先に作られた実行計画(createdの時間で分かります)が、使用されている(accepted列がYESであることで分かります)ことが分かります。

次のSQLでベースラインの実行計画を表示します。dba_sql_plan_baselines ビューで見たように、2つ存在するため、2種類でてきますが、Accepted: YES の方が実際に使われています。つまり、フルスキャンの方が使われています。

select * from table(dbms_xplan.display_sql_plan_baseline(sql_handle=>'&sql_handle'));

以下、実行結果です。

--------------------------------------------------------------------------------
SQL handle: SYS_SQL_3c0d2d9b04210f89
SQL text: select text from testC where no < 1000
--------------------------------------------------------------------------------

--------------------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_04210f89e64f159f
Enabled: YES Fixed: NO Accepted: NO Origin: AUTO-CAPTURE
--------------------------------------------------------------------------------

Plan hash value: 4185343138
 
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 260 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TESTC | 4 | 260 | 1 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IND_TESTC | 1 | | 2 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("NO"<1000)

--------------------------------------------------------------------------------
Plan name: SYS_SQL_PLAN_04210f89eca86bf0
Enabled: YES Fixed: NO Accepted: YES Origin: AUTO-CAPTURE
--------------------------------------------------------------------------------

Plan hash value: 3803945221
 
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 260 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| TESTC | 4 | 260 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------

●まとめ

性能が悪化しづらいということで、喜ぶ方も多いかと思いますが、逆に言うと、性能改善するような実行計画の変動も行われないわけで、そこは何らかのケア(運用)が必要だと思います。

というのも、簡単に考えただけでも、データ量が少ないときに作られた一番速い実行計画はフルスキャンが多いはずで、それらは、データが増えたときにはインデックスアクセスになって欲しいからです。
#上の例は、本機能を有効にした場合に頻繁に起こる事象(実行計画が変わらない)だと思いますが、よくよく考えると性能が改善していないとも言えます。

おそらく、注意事項は「性能改善の必要があるSQLを識別して、チューニングしていく」という運用部分になるんじゃないでしょうか。うまく活用して、システムのトラブル防止に役立てていただければ幸いです。
スポンサーサイト
[ 2009/04/26 23:01 ] DBA | TB(0) | CM(4)
10gまでの機能だと、
○実行計画を固定したい。
⇒統計情報を固定する。
・実行計画が固定されるメリットがある。
(統計情報が陳腐化してしまうリスクを許容する)
○実行計画を変動させたい。
⇒統計情報を取得する。
・統計情報が最新化できるメリットがある。
(実行計画が(マイナスに)変化するリスクを許容する)

となってしまい悩ましいところでしたが、
ベースラインをうまく使用すれば、
「良いところ取り」で運用していけそうですね。

ただ「ベースラインを取得するタイミングと運用」は、
ちょっとスキルが必要かな、と思います。
(経験上、安定したパフォーマンスを出してほしい&
スキルが無くてもチューニング可能なようにしてほしい
って要望が少なくないので、「何らかのケア」の
部分をうまく考えないといけないかと思いました。)
[ 2009/04/27 13:20 ] [ 編集 ]
すみません、よくわかりませんでした。
統計情報を自動収集しないことと、何が違うのでしょうか?
[ 2009/04/28 22:47 ] [ 編集 ]
v-236
実行計画のRowsの値は1,000行程度で2、
30,000行程度で4?これって正しいんですか?
Rowsは、このSQLを実行した結果、処理された行数なんですよね?

ちなみに例題ですが、、、
通常、固定したいのは
SYS_SQL_PLAN_04210f89e64f159fのプラン(INDEXを使用するプラン)ですので、
このプランを固定したら、どんなにデータの件数が少ない場合でも、
INDEXが使用されるプランをオプティマイザが選択してくれて
ウレシイ!まで、表現すればわかりやすいんでしょうね。
(老婆心でした。)
後は、「絵で見てわかるOracle実行プラン」を出版いただければ、言うこと無しですね。
[ 2009/04/29 05:47 ] [ 編集 ]
皆さん、コメントありがとうございます。

コメントで返すのももったいないので、本編で「SQL計画管理2」という記事を書きました。

これで、RZPさんの疑問には答えられたかと思います。
「頑張れ!コンサル」さんの質問には半分応えたような・・・(evolveでインデックスを使うようにevolve”改善”させているので)。rowsの件は良く分かりません(あまり調べていないです)。

「頑張れ!コンサル」さんは、書き方が、超ハイスキルなT野さんのような・・・(ぼそっ)

皆様、引き続きお引き立てよろしくお願いします。
[ 2009/04/29 23:37 ] [ 編集 ]
コメントの投稿













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

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。