【データベース内部構造】SQLはどう処理される?クエリ実行の内部プロセスと最適化の流れ
SQL文を発行した際、データベース(RDBMS)内部ではどのような処理が行われているのだろうか。
SQLは「どのようなデータを取得・更新したいか」という宣言的な記述を行う言語であり、「具体的にどのようにデータを取得するか」という手順はRDBMS内部の処理エンジンが自動的に判断している。
今回は、SQLが投入されてから結果が返されるまでの内部ステップと、効率的な実行処理を行うための「クエリ最適化(Query Optimization)」の流れを整理した。
1. SQL処理の5つのステップ
一般的なRDBMSにおいて、SQL文は主に以下の5つの段階を経て実行される。
- ① Parsing(構文解析)
送られてきたSQLの文法的な正しさ(シンタックスチェック)を解釈・検証する。
SQL実行後の最初のプロセスとして、Parser(構文解析器)がSQLのロジカルな構造を関係演算を表す「Query Tree(クエリツリー)」へ変換する。 - ② Query Validation(クエリ検証・意味解析)
SQL内に指定されたテーブルや列(カラム)がデータベース上に実際に存在するか、アクセス権限があるかなどの「意味的妥当性」を検証する。 - ③ Optimization(最適化 / クエリ最適化)
関係演算を表す Query Tree を、実際のアクセス手順である「物理的な実行プラン(Execution Plan)」へ変換する。
通常、データ取得の手順には複数のバリエーション(多くのプラン)が存在するため、その中で最も効率が良い(低コストな)実行プランを選択する。 - ④ Plan Compile(プランコンパイル)
クエリオプティマイザ(Query Optimizer)によって選択された最適な計画を、実行エンジンが直接処理できるマシンコードや内部コマンド形式へコンパイル・変換する。 - ⑤ Execution(実行)
Query 実行エンジン(Execution Engine)が物理プランに従ってストレージやキャッシュメモリからデータを読み書きし、最終的な結果をクライアントへ返す。
2. クエリ最適化(Query Optimization)の役割
SQLの処理工程の中で、パフォーマンスを決定づける最も重要なコンポーネントが「クエリオプティマイザ(Query Optimizer)」である。
■ 物理プランの大量生成
1つのSQLに対して、「フルスキャンをするか / インデックスを使うか」「テーブル結合の順序をどうするか」「ハッシュ結合かループ結合か」など、多数の物理プラン候補が生成される。
■ コスト評価(Cost-Based Optimization)
オプティマイザは統計情報(データ件数、インデックスのカーディナリティ、データ配置など)を参照し、推定実行時間やI/Oコストなどの「いろいろな値」から最適なプランを算出・算出決定する。
■ 実行エンジンへの受け渡し
最小コストと判定された計画(最適プラン)のみが選択され、Query 実行エンジンに渡されて高速な処理が実現される。
3. まとめ
SQLは「データ取得の結果」を指示するだけで、裏側ではParser(構文解析器)による Query Tree の生成と、Query Optimizer(最適化エンジン)による物理実行プランの決定という高度な処理が自動的に行われている。
SQLパフォーマンスチューニングにおいては、オプティマイザが意図通りの最適な実行プランを選択できるよう、「最新の統計情報(Statistics)の維持」や「適切なインデックス設計」を行うことが重要となる。
✔ プレースホルダ(バインド変数)を使い、Parsing・Plan Compileの再利用(ハードパース削減)を狙えているか?
✔ テーブル統計情報は最新に更新されているか?(古い統計情報だとオプティマイザが間違ったプランを選ぶ)
✔
EXPLAIN / AUTOTRACE 等で最適化された物理実行プランを分析しているか?