一般社団法人 全国個人事業主支援協会

COLUMN コラム

SQLのチューニングって難しいですよねっ!!(唐突)

最近、SQLのチューニングで悪戦苦闘したのでその時の知見をここにまとめます。

 

1.SQLのチューニングとは

DBに馴染みのない方からすると「チューニングって何?」かと思います。

簡単にいうと、凄く処理に時間のかかるSQLがあった時、そのSQLを分析することで、処理速度をあげる行為のことを言います。

チューニング方法は一般的には実行計画を取得・分析した上で以下のような手を取ることで、SQLの性能改善を図ります。

  • 索引の追加や修正
  • WHERE句の条件の見直し
  • 結合順序の最適化
  • サブクエリの書き換え
  • ヒント句の使用

この中でも特に、今回は5番目の「ヒント句の使用」について語っていきます。

 

2.ヒント句とは

SELECT句のすぐ後に記載することで、Oracleに対して「こうすると検索が効率的だよ!」という指示を出します。

文字通りOralceに「ヒントを与える」ことです。

具体的には、以下のような形式で記述します。

SELECT

/*+ ヒント句 */

項目1, 項目2, 項目3

FROM テーブルA

INNER JOIN テーブルB ON テーブルA.項目1 = テーブルB.項目1

 

人間側からすると、分析した結果この順番で、このスキャン方法で、この結合方法だったら効率が良い!ということが

分かっている状態なので、それをOracleにヒントを与えることでOralceは「ふむふむなるほど、これが効率良いのか」

と判断してくれて、性能改善を図ることができます。

とはいえ、あくまで「ヒント」であるため、Oracleが「いやいやこっちの方が効率よい!」と判断すれば、

ヒント句を無視してOracleが考える一番効率の良い実行計画で検索してます。

 

こういう点でも、あくまで「ヒント(=強制力は無い)」なんですね。

 

3.ヒント句のメリット

ヒント句を用いる最大のメリット、それは「既存のSQLの構成を変えなくてよい」これに尽きるかと思います。

1であげた他の方法(索引の追加やWHERE句の見直し、結合順序の最適化)は全て、テーブルやSQLを修正する

必要があります。

それはつまり、テスト内容が複雑化するデグレが起きる可能性が上がることを意味します。

SQLが複雑であればあるほど、このリスクは高まります。

 

一方、ヒント句を用いると、実際の結合順序を変えなくても、ヒント句で「この順番で結合するといいよ!」と

書くだけで、Oracleがうまいこと解釈してくれてその通り結合してます。

万一、人間の判断が間違っていた場合、これまたOracleがうまいことやってくれます。

 

結合順序だけでなく、データのスキャン方法(フルスキャンするか、INDEXスキャンするか)や

テーブルの結合方法(ネステッドループ結合するかハッシュ結合するか)をヒント句で与えることができます。

 

4.まとめ

つまり、ヒント句はプログラム修正のコストやリスクを下げて、SQLを最適化することができる!という

非常に便利なチューニング方法になります。

工数が限られている保守の現場等では、よく使うかもしれないですね。

 

では具体的にどんなヒント句があるのか、どんなヒント句を用いることでSQLの最適化ができるのか、

タイトルの伏線回収とともに、この辺りは次の記事で語りたいと思います。

 

今回はここまで、以上!

 

 

 

 

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア