首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle GROUPING SETS進階分組:精準定製多維匯總,告別CUBE/ROLLUP過度計算

     編輯:Oracle 資料庫基礎

從CUBE到GROUPING SETS:按需生成多維匯總的高效策略

GROUP BY CUBE生成2n組匯總,ROLLUP生成n+1組層級匯總,但實際業務往往只需特定維度組合。Oracle 9i+引入GROUPING SETS,讓您精準聲明所需匯總集合,大幅減少計算量與結果集體積。

對比示範:SH樣本模式銷售表

-- 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組,資料量大時極其昂貴。

GROUPING SETS精準定製

-- 僅需:各產品總計 + 各客戶-通道組合總計
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)。
  • 可混合單欄、多欄、空組,順序不影響結果。

進階技巧

  1. 搭配GROUPING()函數:識別匯總行來源維度
    SELECT GROUPING(prod_id) AS is_prod_total, ... → 0=明細行,1=該維度已匯總。
  2. 複合分組邏輯:
    GROUP BY GROUPING SETS ( (a,b), (a,c), (b) ) 等價於 GROUP BY a,b UNION ALL GROUP BY a,c UNION ALL GROUP BY b 但單掃描完成。
  3. 與ROLLUP/CUBE混用:
    GROUP BY ROLLUP(a), GROUPING SETS((b,c)) 先按a層級匯總,再追加(b,c)組合。

性能效益量化

指標CUBE(3維)GROUPING SETS(2組)
匯總組數82 (+明細)
結果行數18037
掃描次數11
排序/哈希記憶體高低

善用GROUPING SETS,將「計算所有可能」轉變為「按需計算」,是大數據量多維分析報表優化的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved