不要な行をなるべく早く除外すれば、問合せに要する時間が短縮されます。評価の対象としてトラッキングする必要のあるデータ量が減るからです。
次のように、同じ問合せの2つのバージョンがあるとします。最初の形式の問合せでは、最初にレコードを
gでグルーピングし、各グループをフィルタ
(b < 10)に通してから、残ったレコードの合計を計算します。入力レコードはフィルタリングされていないため、グルーピング操作はすべての入力レコードに対して行う必要があります。
RETURN Result AS SELECT
SUM(a) WHERE (b < 10) AS sum_a_blt10
GROUP BY g
2番目の形式の問合せでは、入力をフィルタリングし(
WHERE句を使用)、その後でレコードをグルーピング操作に渡します。このようにすると、グルーピング操作の対象は、問合せ対象のレコードのみになります。対象外のレコードを早めに除外することによって、評価に要する時間が短縮されます。
RETURN Results AS SELECT
SUM(a) AS sum_a_blt10,
WHERE (b < 10)
GROUP BY g
早めにレコードをフィルタリングするもう1つの例を、次の問合せのペアで示します。すでに説明したように、
WHERE句は入力レコードをフィルタリングし、
HAVING句は出力レコードをフィルタリングします。最初の問合せでは、
gのすべての値の合計を計算し、この計算をすべて実行した後で、結果のうち、条件
(g < 10)を満たさないものをすべて除外します。
RETURN Result AS SELECT
SUM(a) AS sum_a
GROUP BY g
HAVING g < 10
一方、2番目の問合せでは、最初に入力レコードをフィルタリングして、対象グループのもののみを残します。その後で、この対象グループのみを集計します。
RETURN Result AS SELECT
SUM(a) AS sum_a
WHERE g < 10
GROUP BY g