2018年5月29日火曜日

Oracle実行計画、SQLチューニング(1)

この記事の内容
 1.実行計画の見方
 2.チューニングTips

**************************************************
**************************************************
それでは早速いきましょう!
 1.実行計画の見方
です。

実行計画の取得~解析のながれ
①sysdbaユーザでsql*plusログイン
sqlplus conn / as sysdba

②PLAN_TABLE作成
2018/6/4訂正
誤)
@C:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlplan.sql
正)
@C:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplan.sql
もしくは、utlcplan.sql?

③クエリ実行
explain plan for
[解析したいクエリ]select * from

④実行計画の取得
@C:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\utlxplp.sql

⑤実行計画の見方
---------------------------------------------------------------------------------
| Id | Operation                      | Name        |    Rows  | Bytes   |  Cost(%CPU)
---------------------------------------------------------------------------------
|  0 | SELECT STATEMENT               |
|  1 |  SORT GROUP BY                 |
|  2 |   NESTED LOOPS                 |
|  3 |    TABLE ACCESS BY INDEX ROWID | HOGE_IDX11
|  4 |   NESTED LOOPS                 |
|  5 |    TABLE ACCESS BY INDEX ROWID | HOGE_HOGE1
(省略)
---------------------------------------------------------------------------------
基本はCostが極端に上がっている箇所を要チェック!
RANGE SCANなら問題ない(はず)

一番ネスト深い位置からスタートし、同階層に複数ある場合には
Idが若い(上から)順にアクセスされる。(アクセス順序)

この例だと
 3 → 5 → 2 → 4・・・

<ポイント>
 ★1.アクセスパスについて
    FULL SCAN箇所ないか
 ★2.結合順序
    妥当かどうか
 ★3.結合方式
    MERGE JOIN CARTESIAN(直積結合)が発生している場合には、結合方式の変更する必要あり!

****************************************************************************************
次に
 2.チューニングTips
代表的なものを整理しておく。

<ポイント>
 ★1.INNER JOIN句内で絞り込みできないか検討してみる
 ★2.関数は右側に書く
 ★3.暗黙の型変換が起きないようにする。
    ex.XXX=''とか
 ★4.IS NULL だとインデックスが効かないため、DB項目設計時に考慮しておく。
    ex.名称項目 is not nullとかしないくてもいいように制御用のFLGを用意するとか
      名称有無FLG='1'で要件満たせるならOK!
 ★5.LIKEの中間一致、後方一致は使わない
    ex.Function Index検討する。
 ★6.<>ではなく、in句での置き換え可能か検討する

チューニングは実践してもなんぼだと感じます。
とはいっても性能問題で苦労したくないのも事実だけどね・・・

0 件のコメント:

コメントを投稿