SQLのチューニングって難しいですよねっ!!(唐突)
最近、SQLのチューニングで悪戦苦闘したのでその時の知見をここにまとめます。
DBに馴染みのない方からすると「チューニングって何?」かと思います。
簡単にいうと、凄く処理に時間のかかるSQLがあった時、そのSQLを分析することで、処理速度をあげる行為のことを言います。
チューニング方法は一般的には実行計画を取得・分析した上で以下のような手を取ることで、SQLの性能改善を図ります。
この中でも特に、今回は5番目の「ヒント句の使用」について語っていきます。
SELECT句のすぐ後に記載することで、Oracleに対して「こうすると検索が効率的だよ!」という指示を出します。
文字通りOralceに「ヒントを与える」ことです。
具体的には、以下のような形式で記述します。
SELECT
/*+ ヒント句 */
項目1, 項目2, 項目3
FROM テーブルA
INNER JOIN テーブルB ON テーブルA.項目1 = テーブルB.項目1
人間側からすると、分析した結果この順番で、このスキャン方法で、この結合方法だったら効率が良い!ということが
分かっている状態なので、それをOracleにヒントを与えることでOralceは「ふむふむなるほど、これが効率良いのか」
と判断してくれて、性能改善を図ることができます。
とはいえ、あくまで「ヒント」であるため、Oracleが「いやいやこっちの方が効率よい!」と判断すれば、
ヒント句を無視してOracleが考える一番効率の良い実行計画で検索してます。
こういう点でも、あくまで「ヒント(=強制力は無い)」なんですね。
ヒント句を用いる最大のメリット、それは「既存のSQLの構成を変えなくてよい」これに尽きるかと思います。
1であげた他の方法(索引の追加やWHERE句の見直し、結合順序の最適化)は全て、テーブルやSQLを修正する
必要があります。
それはつまり、テスト内容が複雑化する、デグレが起きる可能性が上がることを意味します。
SQLが複雑であればあるほど、このリスクは高まります。
一方、ヒント句を用いると、実際の結合順序を変えなくても、ヒント句で「この順番で結合するといいよ!」と
書くだけで、Oracleがうまいこと解釈してくれてその通り結合してます。
万一、人間の判断が間違っていた場合、これまたOracleがうまいことやってくれます。
結合順序だけでなく、データのスキャン方法(フルスキャンするか、INDEXスキャンするか)や
テーブルの結合方法(ネステッドループ結合するかハッシュ結合するか)をヒント句で与えることができます。
つまり、ヒント句はプログラム修正のコストやリスクを下げて、SQLを最適化することができる!という
非常に便利なチューニング方法になります。
工数が限られている保守の現場等では、よく使うかもしれないですね。
では具体的にどんなヒント句があるのか、どんなヒント句を用いることでSQLの最適化ができるのか、
タイトルの伏線回収とともに、この辺りは次の記事で語りたいと思います。
今回はここまで、以上!