Sybase IQ 12.7 User Manual

Page of 212
クエリ構築のヒント
 
32
 
Sybase IQ
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;