すべてのプロダクト
Search
ドキュメントセンター

PolarDB:ROLLUP 構文を使用したパラレルクエリの高速化

最終更新日:Aug 06, 2026

標準的な GROUP BY クエリは、グループごとに 1 つの集約行を返します。国内のすべての製品の合計や、全年度の総計など、より高いレベルの小計を取得するには、別々のクエリを実行するか、結果を手動で集約する必要があります。ROLLUP を使用すると、単一のクエリですべての階層的な小計を計算できます。PolarDB のパラレルクエリ機能と組み合わせることで、ROLLUP は集約処理を複数のスレッドに分散し、大規模なデータセットでのクエリ時間を大幅に短縮します。

前提条件

開始する前に、以下を確認してください。

  • PolarDB for MySQL 8.0 クラスターのリビジョンバージョンが 8.0.1.1.0 以降であること

クラスターのバージョンを確認するには、「エンジンクラスターを照会する」をご参照ください。

仕組み

ROLLUP は GROUP BY を拡張し、同じ結果セット内にすべての上位レベルの小計を生成します。WITH ROLLUP を GROUP BY 句の列の後に追加します。

SELECT year, country, product, SUM(profit) AS profit
FROM sales
GROUP BY year, country, product WITH ROLLUP;

ROLLUP は、グループ化列を右から左に処理して小計を計算します。GROUP BY year, country, product WITH ROLLUP の場合、クエリは 4 つの集約レベルを生成します。

レベル有効なグループ化行が表す内容
1year, country, product製品ごとの利益
2year, country国ごとの利益 (すべての製品の合計)
3year年ごとの利益 (すべての国と製品の合計)
4(なし)総計

メリット

複数の個別のクエリの代わりに ROLLUP を使用すると、以下の利点があります。

  • クエリの簡素化:単一のステートメントで、異なる粒度の複数の GROUP BY クエリを置き換えます。

  • クライアント負荷の軽減:サーバーがすべての集約を計算し、クライアントは一度だけデータを読み取るため、処理オーバーヘッドとネットワークトラフィックが削減されます。

  • 並列実行:ROLLUP をパラレルクエリと組み合わせると、PolarDB は集約処理を複数のスレッドに分散し、大規模なデータセットでのパフォーマンスを大幅に向上させます。

パラレルクエリでのパフォーマンス

PolarDB は、集約処理を複数のスレッドに分散することで ROLLUP クエリを高速化します。以下の TPC Benchmark H (TPC-H) Q1 クエリは、WITH ROLLUP を含むように変更されており、パフォーマンスの向上を示しています。

説明

この例では、TPC-Hベンチマークに基づくテストが実装されていますが、TPC-Hベンチマークテストのすべての要件を満たしているわけではありません。 そのため、テスト結果は TPC-H のベンチマークテストの公開結果と一致しない可能性があります。

SELECT
    l_returnflag,
    l_linestatus,
    sum(l_quantity) AS sum_qty,
    sum(l_extendedprice) AS sum_base_price,
    sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price,
    sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge,
    avg(l_quantity) AS avg_qty,
    avg(l_extendedprice) AS avg_price,
    avg(l_discount) AS avg_disc,
    count(*) AS count_order
FROM
    lineitem
WHERE
    l_shipdate <= date_sub('1998-12-01', interval ':1' day)
GROUP BY
    l_returnflag,
    l_linestatus
WITH ROLLUP
ORDER BY
    l_returnflag,
    l_linestatus;

結果:

  • パラレルクエリなし: 318.73 秒

    
    root@localhost:dbt3 8.0.13-rds-dev> select
        ->   l_returnflag,
        ->   l_linestatus,
        ->   sum(l_quantity) as sum_qty,
        ->   sum(l_extendedprice) as sum_base_price,
        ->   sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
        ->   sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
        ->   avg(l_quantity) as avg_qty,
        ->   avg(l_extendedprice) as avg_price,
        ->   avg(l_discount) as avg_disc,
        ->   count(*) as count_order
        -> from
        ->   lineitem
        -> where
        ->   l_shipdate <= date_sub('1998-12-01', interval ':1' day)
        -> group by
        ->   l_returnflag,
        ->   l_linestatus
        -> with rollup
        -> order by
        ->   l_returnflag,
        ->   l_linestatus;
    
    +--------------+--------------+----------------+------------------+------------------+--------------------+-----------+--------------+----------+-------------+
    | l_returnflag | l_linestatus | sum_qty        | sum_base_price   | sum_disc_price   | sum_charge         | avg_qty   | avg_price    | avg_disc | count_order |
    +--------------+--------------+----------------+------------------+------------------+--------------------+-----------+--------------+----------+-------------+
    | NULL         | NULL         | 1526902118.00  | 2289567239008.24 | 2175081814581.56 | 2262103960452.92   | 25.501098 | 38238.521048 | 0.050000 | 59875936    |
    | A            | NULL         | 37683718.00    | 56503738343.68   | 53678288298.22   | 55826126394.60     | 25.500331 | 38236.069808 | 0.050005 | 14777601    |
    | A            | F            | 37683718.00    | 56503738343.68   | 53678288298.22   | 55826126394.60     | 25.500331 | 38236.069808 | 0.050005 | 14777601    |
    | N            | NULL         | 86161188.00    | 129177648653.15  | 122717968200.81  | 127622455366.14    | 25.497843 | 38237.208251 | 0.050001 | 30318514    |
    | N            | F            | 9839917.00     | 14735826224.79   | 13998714160.55   | 14559295139.03     | 25.516888 | 38247.950877 | 0.049977 | 385521      |
    | N            | O            | 76321271.00    | 114441822428.36  | 108719254040.26  | 113063160227.11    | 25.497601 | 38234.013094 | 0.050002 | 29932993    |
    | R            | NULL         | 37702476.00    | 56537580506.41   | 53710767035.27   | 55853917990.17     | 25.508535 | 38251.886895 | 0.049997 | 14780338    |
    | R            | F            | 37702476.00    | 56537580506.41   | 53710767035.27   | 55853917990.17     | 25.508535 | 38251.886895 | 0.049997 | 14780338    |
    +--------------+--------------+----------------+------------------+------------------+--------------------+-----------+--------------+----------+-------------+
    8 rows in set, 3 warnings (5 min 18.73 sec)
    
  • パラレルクエリあり: 22.30 秒 — 14 倍以上高速化

    
    root@localhost:dbt3 8.0.13-rds-dev> select /*+ SET_VAR(max_parallel_degree=32) */
        -> l_returnflag,
        -> l_linestatus,
        -> sum(l_quantity) as sum_qty,
        -> sum(l_extendedprice) as sum_base_price,
        -> sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
        -> sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
        -> avg(l_quantity) as avg_qty,
        -> avg(l_extendedprice) as avg_price,
        -> avg(l_discount) as avg_disc,
        -> count(*) as count_order
        -> from
        -> lineitem
        -> where
        -> l_shipdate <= date_sub('1998-12-01', interval '1' day)
        -> group by
        -> l_returnflag,
        -> l_linestatus
        -> with rollup
        -> order by
        -> l_returnflag,
        -> l_linestatus;
    
    | l_returnflag | l_linestatus | sum_qty        | sum_base_price    | sum_disc_price     | sum_charge         | avg_qty   | avg_price    | avg_disc | count_order |
    |--------------+--------------+----------------+-------------------+--------------------+--------------------+-----------+--------------+----------+-------------|
    | NULL         | NULL         | 1526902118.00  | 22839567239008.24 | 2175081814581.563  | 2262103960452.9198 | 25.501098 | 38238.521048 | 0.050008 | 59785936    |
    | A            | NULL         | 376633718.00   | 565003738347.68   | 536782889857.2197  | 558261263942.6043  | 25.500331 | 38236.693008 | 0.050005 | 14777601    |
    | A            | F            | 376633718.00   | 565003738347.68   | 536782889857.2197  | 558261263942.6043  | 25.500331 | 38236.693008 | 0.050005 | 14777601    |
    | N            | NULL         | 775804634.00   | 11591540955214.15 | 11001912541965.18  | 11445508937148.143 | 25.497847 | 38233.208251 | 0.050008 | 30302907    |
    | N            | F            | 9439317.00     | 14174538224.79    | 13399171416810.59  | 14550093539.1104   | 25.514642 | 38284.468099 | 0.049935 | 369914      |
    | N            | O            | 763212717.00   | 11444182242889.36 | 10871925402084.36  | 11306316022279.113 | 25.49766  | 38233.013698 | 0.050009 | 29932993    |
    | R            | NULL         | 377024766.00   | 56535804956.41    | 53710676703959.27  | 55854919770932.17  | 25.505586 | 38241.865898 | 0.050009 | 14777338    |
    | R            | F            | 377024766.00   | 56535804956.41    | 53710676703959.27  | 55854919770932.17  | 25.505586 | 38241.865898 | 0.050009 | 14777338    |
    |--------------+--------------+----------------+-------------------+--------------------+--------------------+-----------+--------------+----------+-------------|
    8 rows in set, 3 warnings (22.30 sec)