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句での置き換え可能か検討する

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

2018年5月16日水曜日

robocopyを使ってみる

robocopy [コピー元] [コピー先] /s /e /log+:[logファイル名]
robocopy .\src .\dst /xf web.config user.config exe.config /s /e /log+:hoge.log
※log追記型

<参考サイト>
Windowsの「robocopy」コマンドでフォルダをバックアップ/同期させる
http://www.atmarkit.co.jp/ait/articles/0704/20/news130.html

【ROBOCOPY】特定のファイル・フォルダをコピー対象から除外するオプション
https://pig-log.com/robocopy-option-exclude/

robocopy - 個人的によく使うオプションメモ
https://golorih.exblog.jp/21438298/

2018年5月12日土曜日

Oracle色々(11grR2,12cR2)

前提:Oracle 11g(Release 11.2.0)、12c(Release 12.1.0、12.2.0)

1.そもそも編

<インスタンスとデータベースの違いとは?>
 メモリ空間の話  →インスタンス
 物理ファイル群の話→データベース
 RAC構成の場合、1つのデータベース・複数のインスタンス、ということになる。
 
 RAC…Real Application Clusters。複数サーバ(インスタンス)で1つのデータベースを共有する仕組み。
      RAC構成はActive/Active構成。(Active/Standbyではない)

 RAC構成メリット
  ①耐障害性の向上
  ②拡張性の向上
   サーバを後から追加可能(スケールアウト)
  ③負荷分散の実現
   性能を安定化、負荷の平準化。

<性能向上するために>
 一般的にもDISKアクセスは遅く、Cacheアクセスの方が速い

 Oracleではデータ参照スピードを上げるために
 テーブルにインデックスを貼る方法が通例。
 
 インデックス対象データはメモリ(SGA データベース・バッファ・キャッシュ)へ展開され
 その結果アクセス効率が上がる。
 (SGAに検索対象が存在すれば、テーブル(Disk)の参照不要)
 
 REDOログバッファ
 →昨今ではあまり問題にならない傾向。
 
 オプティマイザ
 →共有プールにあるライブラリキャッシュを参照して経路を決める。
  ライブラリキャッシュ…アプリケーションコード(コンパイル済)保持。
             SQL解析ツリー、実行計画

<V$表を利用したSGA領域の見積方法>
■V$DB_CACHE_ADVICE
select
SIZE_FOR_ESTIMATE
, SIZE_FACTOR
, ESTD_PHYSICAL_READ_FACTOR
, ESTD_PHYSIVAL_READS
from V$DB_CACHE_ADVICE;

※SIZE_FACTOR(現在値1)を変化させてESTD_PHYSIVAL_READSが減るなら効果あり

■V$SHARED_POOL_ADVICE
select
SHARED_POOL_SIZE_FOR_ESTIMATE
, SHARED_POOL_SIZE_FACTOR
, ESTD_LC_MEMORY_OBJECT_HITS
from V$SHARED_POOL_ADVICE;

<V$表を利用したPGA領域の見積方法>
select
count(n.name) SESSION_COUNT
, sum(s.value/1024/1024) SESSION_MEMORY_MB
from v$sesstat s, v$statname n, v$session se
where n.statistic# = s.statistic#
and s.sid=se.sid
and n.name in ('session pga memory');

SESSION_COUNT×2MB または SESSION_MEMORY_MB(MB)を参考にする

<各メモリとパラメータについて>
Oracle11g以降
MEMORY_TARGETに設定した値の範囲でいい感じにやってくれる。
→明示的に対象パラメータに値を設定することで最低限の値を確保してくれる。

参考サイト
津島博士のパフォーマンス講座
http://www.oracle.com/technetwork/jp/database/articles/tsushima/index.html

Oracleの実行計画を読んでみよう!
https://www.slideshare.net/ryotawatabe/20170907-dbts2017-tokyo-cosol-how-to-read-oracle-execution-plan