質問
エグゼキューターの評価順序とその理由を解説してください |
解答
SQLにおける**エグゼキューター(Executor)**とは、クエリプランナーが決定した実行計画(クエリプラン)に従って、実際にデータを処理して結果を返すコンポーネントです。 ここで重要なのが、SQL文の記述順と実際の評価(処理)順は異なるという点です。 🔷 SQLの評価順序(実行順序) 以下は一般的な `SELECT` 文の構成です: ```sql SELECT [DISTINCT] カラム名 FROM テーブル JOIN ... WHERE 条件 GROUP BY ... HAVING 条件 ORDER BY ... LIMIT ... ``` しかし、SQLエグゼキューターは以下の順序で処理を行います:
✅ なぜこの順序なのか?(理由) 1. `FROM` → `JOIN` → `WHERE` * まずデータがどこから来るかを決定し、結合して、行単位のフィルタをかける 2. `GROUP BY` の前に `WHERE` * `GROUP BY` は集計の単位を決めるため、個別行のフィルタ(WHERE)を先に行う必要がある 3. `HAVING` は `GROUP BY` の後 * `HAVING` は集計結果に対して条件をつける ```sql HAVING COUNT(*) > 3-- ← GROUP BY の後でないとカウントできない ``` 4. `SELECT` は遅い段階で評価 * `SELECT` はどのカラムや計算結果を返すかを最後に決める * `WHERE` では使えない `SELECT` のエイリアスがあるのはこのため 5. `ORDER BY`・`LIMIT` は最後 * 出力対象が決まってから、並び替えや件数制限を行う ✅ 具体例で確認 ```sql SELECT department, COUNT(*) as cnt FROM employees WHERE salary > 5000 GROUP BY department HAVING COUNT(*) > 2 ORDER BY cnt DESC LIMIT 3; ``` このクエリの評価手順: 1. `FROM employees` 2. `WHERE salary > 5000` でフィルタ 3. `GROUP BY department` 4. `HAVING COUNT(*) > 2` 5. `SELECT department, COUNT(*) as cnt` 6. `ORDER BY cnt DESC` 7. `LIMIT 3` 🔚 まとめ
さらに、サブクエリやビューの最適化にも役立ちます。 |
|
|

この記事へのコメント