標準的な 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 つの集約レベルを生成します。
| レベル | 有効なグループ化 | 行が表す内容 |
|---|---|---|
| 1 | year, country, product | 製品ごとの利益 |
| 2 | year, country | 国ごとの利益 (すべての製品の合計) |
| 3 | year | 年ごとの利益 (すべての国と製品の合計) |
| 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)