SQLを作成する時は、パースを意識しよう
こんにちは開発一部第4課の西村です。
システムの運用保守で性能問題が発生した際、SQLを見直すことになることは、よくあります。
性能問題が発生してからチューニングを実施すると、どうしても運用に影響がでてしまうので、設計段階から意識して改善していくことが望ましいです。
SQLのチューニングにはいろいろな方法がありますが、本記事では「パース」に注目して書いていこうと思います。
「パース」に注目することで、パフォーマンスだけではなく、セキュリティ面での強化も期待できます。
はじめに
パースとは、SQL文を解析することです。
解析結果は共有プールにキャッシュされ、解析結果を使用することにより、すぐにSQL文を実行することができます。
これを、ソフトパースと呼びます。
キャッシュされた解析結果が存在しない場合、SQLの検証、実行計画の作成を行った後、SQLを実行します。
これを、ハードパースと呼びます。
パフォーマンスの高いシステム設計をするためには、できるだけハードパースを回避する必要があります。
では、パース時間を減らすための方法を3点紹介します。
SQL構文を統一する。
同じ内容のSQLでも、大文字小文字の違いや空白の個数、改行位置、別名の違いで、別のSQL文と解釈します。
ハードパースを回避するため、SQL構文は統一しましょう。
例
(大文字と小文字の違い)
(改行位置の違い)
バインド変数を使用する。
SQLが解析される際、リテラル値を使用していると、IDの数だけ解析されます。
バインド変数を使うことで、同じ構文のSQL文は再利用され、ハードパースの頻度を下げることができます。
例
① リテラル値使用
② バインド変数使用
結合する表の数を制限する。
実行計画が作成される際、アクセス順番の検討が行われます。
nテーブルを結合する場合、単純に考えるとn!通りの順序があります。
パース時間を軽減するために、表の結合数を考慮しましょう。
また、テーブル設計で多くの表を結合する必要がないように意識しましょう。
例
(結合4表)
おわりに
「パース」を意識したSQL設計は、パフォーマンスの最適化だけではなく、保守性にも繋がります。
繰り返し実行される処理を中心に、ボトルネックを可視化しながら改善をしていきましょう。