ヒント句をつけたい、概要をざっくりと知りたいときに読める簡単な説明と手順を書きました。
##パフォーマンスチューニングとは
大量のデータを保持するシステムでは、バッチOR画面処理の中で使用しているSQLレスポンスが遅くなってしまい、バッチが終了しないOR画面上でボタン押下してもその後の結果が返ってこないということがあります。
こういった場合に限らず、パフォーマンスの悪いSQL(なかなか返ってこないSQL)のパフォーマンスを改善してあげることをパフォーマンスチューニングといいます。
今回はヒント句を追加してパフォーマンス改善しようというコンセプトで進めますが、パフォーマンスが悪化してしまった(OR元から悪い)場合の対処方法はヒント句をつけるだけではありませんので、そちらご了承ください。
##ヒント句とは
上記でヒント句をつける対応を取るとお話ししましたが。そもそもヒント句とは?というところです。
ヒント句とはOracleのオプティマイザが実行計画を作成する際にどのINDEXを使うか、結合しているテーブルをどういった順番で結合するかといった要素を指定してあげるものです。
ヒント句による指定しない場合(通常のSQLのまま)、Oracleが統計情報を元に最適な実行計画を選択してくれます。
しかし、複雑なSQL文となると突然古い統計情報を参照したり、新しい統計情報を参照してみたりと実行計画がぶれてしまうことがあります。
なので、決まってパフォーマンスが良い実行計画を参照するようにOracleに対して「この実行計画を選んでね」と指定してあげるのがヒント句です(実際にはヒント句を指定することで決まったINDEX・決まった表の結合順序等にすることで実行計画を固定してあげる)。
##手順
OracleDBおけるパフォーマンスチューニングは以下の手順で実施します。
- 実行計画の取得
- SQLが遅い原因分析
- SQLにヒント句をつける
###実行計画の取得
実行計画を取得する方法は複数ありますが、私はSQLDeveloperでしか実行したことないので今回はそちらについて書きます。簡単です。explain pla forを用いた方法です。
explain plan for
SQL文をそのまま書く
/
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY())
/
↑を実行すると実行計画が返されます。
PLAN_TABLE_OUTPUT
SQL_ID XXXXXXXXXXXXX
--------------------
SQL文
Plan hash value: XXXXXXXXX
------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 1 (100)| |
| 1 | INLIST ITERATOR | | | | | |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| XXXXXX | 1 | 50 | 1 (0)| 00:00:01 |
| 3 | INDEX RANGE SCAN | XXXXXXX | 2 | | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
SQLIDとは1つのSQL文に対して振られるIDで、SQL文のうちどこか少しでも変わるとまた違うIDが振られます。
同じSQL文は何回実行しても同じSQLIDが振られます。
plan hash valueとは、実行計画に対して振られる値です。1つのSQLIDに対して複数のplan hash valueが存在することもあります。
次に実行計画を元にSQLがどうして遅いかを見ていきます。
###SQLが遅い原因分析
取得した実行計画を元にSQLがどうして遅くなったのかを見てあげます。
遅くなった原因は場合によって違いますが、2つ例を挙げてみます。
・表の結合順番が良くない
データ量の大きい表から先に結合してしまうと、テーブル全てをスキャンするのに時間を要してしまう
・INDEXを使用できていない
結果が早くなるINDEXが存在しているものの、そのINDEXを使用してあげられていない
###ヒント句の付け方
SQLが遅い原因を分析できたら、原因に対応したヒント句をつけます。
【書き方】
select /*+ LEADING (T1 T2) / from テーブル名;
とういうようにSELECT句の後に、/+ ヒント句/を入れてあげます。
ヒント句の箇所は都度適したものを入れます。複数入れることも可能です。
ざっくりとした手順はこれだけです。簡単で、なんかちょっと可愛いですよね。以上です。ありがとうございました。