クエリ構築のヒント
UNION ALL での GROUP BY がクエリ・パフォーマンスに与える影響
パフォーマンスを向上させるために、非常に大きなテーブルを複数の小さな テーブルにセグメント化し、ビューで UNION ALL を使用してアクセスするこ とがよくあります。このようなビューを GROUP BY とともに使用する特定の 非常に個別的なクエリでは、Sybase IQ オプティマイザがいくつかの GROUP BY 処理を UNION ALL の各分岐に挿入して、処理を並列に実行し、結果を結 合することでパフォーマンスを向上させることができます。分割 GROUP BY と呼ばれるこの方法では、最上位レベルの GROUP BY で処理されるデータの 量が減少し、その結果、クエリ処理時間が減少します。
パフォーマンスが向上するのは、UNION ALL で GROUP BY を使用する特定 のクエリだけです。たとえば、次の簡単なクエリは分割 GROUP BY によって パフォーマンスが向上します。
CREATE VIEW vtable (v1 int, v2 char(4)) AS
SELECT a1, a2 FROM tableA
UNION ALL
SELECT b1, b2 FROM tableB;
SELECT COUNT(*), SUM(v1) FROM vtable GROUP BY v2;
このクエリを分析するときに、オプティマイザは先に tableA で COUNT(*) GROUP BY を実行し、tableB で COUNT(*) GROUP BY を実行した後、結果を 最上位レベルの GROUP BY に渡します。最上位レベルの GROUP BY は、2 つ
のCOUNT(*) の結果の SUM を実行し、最終的なクエリ結果を生成します。最 上位レベルの GROUP BY の役割が変化していることに注意してください。最 上位レベルの GROUP BY が使用している集合関数は COUNT ではなく SUM です。
分割 GROUP BY の制限 分割 GROUP BY によってパフォーマンスが向上する状況とクエリには、いく つかの制限があります。
•クエリでUNION ではなくUNION ALL を使用している場合に、分割GROUP BY によってクエリのパフォーマンスが向上する可能性があります。次のク エリでは UNION で GROUP BY を使用しているため、分割 GROUP BY によ るメリットはありません。
CREATE VIEW viewA (va1 int, va2 int, va3 int, va4 int) AS
SELECT b1, b2, b3, b4 FROM tableB
UNION
SELECT c1, c2, c3, c4 FROM tableC;
SELECT SUM(va1) FROM viewA GROUP BY va3;
32 | Sybase IQ |