GROUP BY CUBE生成2n組匯總,ROLLUP生成n+1組層級匯總,但實際業務往往只需特定維度組合。Oracle 9i+引入GROUPING SETS,讓您精準聲明所需匯總集合,大幅減少計算量與結果集體積。
-- CUBE生成8組匯總(3維度 → 2³=8)
SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)
FROM sales
WHERE cust_id < 3
GROUP BY CUBE (prod_id, cust_id, channel_id);
產生:總計、各單維度、各雙維度組合、三維明細 — 共8組,資料量大時極其昂貴。
-- 僅需:各產品總計 + 各客戶-通道組合總計
SELECT prod_id, cust_id, channel_id, SUM(quantity_sold)
FROM sales
WHERE cust_id < 3
GROUP BY GROUPING SETS (
(prod_id), -- 產品維度匯總
(cust_id, channel_id) -- 客戶×通道雙維度匯總
);
結果:從180行壓縮至37行,僅計算業務關心的2組匯總 + 明細行。
GROUP BY GROUPING SETS ( (col_list_1), (col_list_2), ..., () )
GROUP BY組合。()代表總計行(Grand Total)。SELECT GROUPING(prod_id) AS is_prod_total, ... → 0=明細行,1=該維度已匯總。GROUP BY GROUPING SETS ( (a,b), (a,c), (b) ) 等價於 GROUP BY a,b UNION ALL GROUP BY a,c UNION ALL GROUP BY b 但單掃描完成。GROUP BY ROLLUP(a), GROUPING SETS((b,c)) 先按a層級匯總,再追加(b,c)組合。| 指標 | CUBE(3維) | GROUPING SETS(2組) |
|---|---|---|
| 匯總組數 | 8 | 2 (+明細) |
| 結果行數 | 180 | 37 |
| 掃描次數 | 1 | 1 |
| 排序/哈希記憶體 | 高 | 低 |
善用GROUPING SETS,將「計算所有可能」轉變為「按需計算」,是大數據量多維分析報表優化的利器。