エグゼキューターの評価順序

boitumelo-0DJHJcpwN9Q-unsplash.jpg

質問

エグゼキューターの評価順序とその理由を解説してください


解答

SQLにおける**エグゼキューター(Executor)**とは、クエリプランナーが決定した実行計画(クエリプラン)に従って、実際にデータを処理して結果を返すコンポーネントです。

ここで重要なのが、SQL文の記述順と実際の評価(処理)順は異なるという点です。


🔷 SQLの評価順序(実行順序)

以下は一般的な `SELECT` 文の構成です:

```sql

SELECT [DISTINCT] カラム名
FROM テーブル
JOIN ...
WHERE 条件
GROUP BY ...
HAVING 条件
ORDER BY ...
LIMIT ...

```

しかし、SQLエグゼキューターは以下の順序で処理を行います:
順番処理説明
`FROM`対象のテーブルやビューを決定し、結合(JOIN)を処理
`ON`JOIN条件の評価(INNER/OUTER JOIN)
`JOIN`テーブルの結合(条件に応じて)
`WHERE`行単位でフィルタリング(集計前)
`GROUP BY`グループ化(集計単位を決定)
`HAVING`グループ単位でフィルタリング(集計後)
`SELECT`表示する列や式を選択(集計関数の評価もここ)
`DISTINCT`重複行の削除
`ORDER BY`並び替え
`LIMIT`出力件数の制限


✅ なぜこの順序なのか?(理由)

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`

🔚 まとめ

処理段階役割
FROMデータの取得元を確定
WHERE行単位のフィルタ
GROUP BY集計の単位を定義
HAVING集計後のフィルタ
SELECT表示する列や式を決定
ORDER BY出力順序を決定
LIMIT結果件数の制限
この順序を理解しておくと、クエリのバグや意図しない結果を防げます。
さらに、サブクエリやビューの最適化にも役立ちます。






データベースシステム(改訂2版) [ 北川 博之 ]

価格:3520円
(2025/6/9 12:23時点)
感想(0件)


データベースシステム(改訂2版) [ 北川 博之 ]

価格:3520円
(2025/4/23 14:18時点)
感想(0件)


 



この記事へのコメント