在這篇論文之前 — 它所降落的世界
1990 年代中期,決策支援的工作流程是一個 extract-visualize-analyze 迴圈:先把彙總後的資料從 SQL 資料庫抽出成檔案或資料表,再放進試算表或視覺化工具呈現,然後據此擬定下一個查詢。這個迴圈的視覺化端早就以 N 維方式思考——Excel 樞紐分析表、內建交叉分析的報表工具、Microsoft Access 的 TRANSFORM-PIVOT 運算子、Essbase 的多維陣列——但資料庫端只有 COUNT、SUM、MIN、MAX、AVG,以及每個群組只回傳一列的 GROUP BY。各家廠商各自以互不相容的方式補洞:Red Brick 加了 Rank、N_tile、Ratio_To_Total 與累積型聚合,Informix Illustra 與 IBM DB2 Common Server 則讓使用者以 Init、Iter、Final 三個 callback 註冊新的聚合函式。聚合也絕非冷門需求——論文自己對標準基準測試的統計顯示,TPC-D 的 16 個查詢裡就有 27 個聚合與 15 個 GROUP BY,連 OLTP 基準測試裡都出現聚合。真正缺的,是一個在形狀上與下游工具同樣是 N 維的關聯式運算子。
術語 — 依本篇論文的用法
- Data cube(CUBE 運算子)
- 把一張資料表在 N 個分組欄位的所有子集合上做聚合所得到的關聯,每一種維度值組合(含被摺疊掉的維度)各成一列。論文的重點在於它是一個關聯,而不是一種報表版面。
- ALL 值
- 放在超級聚合列的分組欄位中的特殊值,標示該欄位已被聚合掉。論文主張把它讀成該次聚合所涵蓋的集合,例如 ALL(Model) = {Chevy, Ford},而不是像 NULL 那樣的未知值。
- 超級聚合(super-aggregate)
- 任何至少含一個 ALL 的 cube 列,也就是在 cube 的較低維度子空間上算出的聚合。N 個分組欄位會在核心 group-by 之外再產生 2^N - 1 種超級聚合分組。
- ROLLUP
- CUBE 的不對稱退化形式,從最右邊的分組欄位開始逐一換成 ALL,產生 drill-down 報表中逐層變粗的小計。N 維 roll-up 只在核心答案集合上多加 N 列。
- 交叉分析表(cross tab)
- 帶有列總計、欄總計與總計的對稱二維聚合。論文指出這種緊湊的陣列表示,與使用 ALL 值的關聯式表示完全等價,而且兩者都可推廣到 N 維。
- distributive 聚合函式
- 存在某個 G 使 F({Xij}) = G({F({Xij | i}) | j}) 的聚合函式,也就是子聚合可以直接再被聚合。COUNT、SUM、MIN、MAX 都屬此類;除 COUNT 的 G 是 SUM 外,其餘皆為 F = G。
- algebraic 聚合函式
- 子聚合可以用固定大小的 M-tuple 概括、再由函式 H 收尾的聚合函式。平均值攜帶 sum 與 count;標準差、MaxN、MinN 與質心是論文舉的其他例子。
- holistic 聚合函式
- 描述一個子聚合所需的儲存空間不存在常數上界 M 的聚合函式,因此無法由部分結果推出超級聚合。論文所舉的例子是中位數、眾數(MostFrequent)與 rank。
- GROUPING()
- 論文提出的布林函式,當 select 清單中的元素是超級聚合佔位符時回傳 TRUE,否則回傳 FALSE。它讓系統可以用 NULL 編碼 ALL,同時仍能與資料中真正的 NULL 區分開來。