SQL Server 2012(代號 Denali)引入的 Columnstore Index(列存儲索引),將資料按「欄」而非「列」儲存,配合高壓縮率與批次模式查詢處理,讓資料倉庫型工作負載的查詢速度提升 數十倍至百倍。本文深入解析其架構優勢、適用場景、限制與實務操作策略。
| 傳統列存儲 | 列存儲索引 |
|---|---|
| 逐列儲存,讀取一列需讀取所有欄位 | 逐欄儲存,查詢只讀取涉及欄位 |
| 壓縮率低(同列資料型別不同) | 極高壓縮(同欄資料型別相同、重複值多) |
| I/O 讀取整列,記憶體浪費大 | I/O 僅讀必要欄位,記憶體足跡極小 |
| 適合 OLTP 單列點查 | 適合 OLAP 大範圍掃描、聚合、過濾 |
binary/varbinary/image/text/ntext/varchar(max)/nvarchar(max)/uniqueidentifier/timestamp/decimal(>18)/CLR/XML 等。-- 每日維護窗口
DROP INDEX cci_FactSales ON FactSales; -- 移除列存儲
-- 執行 ETL 載入/更新/刪除
CREATE CLUSTERED COLUMNSTORE INDEX cci_FactSales ON FactSales; -- 重建
ALTER TABLE ... SWITCH PARTITION 將新分區切入主表。SWITCH OUT → 移除索引 → 更新 → 重建索引 → SWITCH IN。-- 冷資料表(列存儲)
CREATE CLUSTERED COLUMNSTORE INDEX cci_Sales_History ON Sales_History;
-- 熱資料表(傳統 B-tree,支援隨意寫入)
CREATE TABLE Sales_Current (...);
-- 查詢視圖
CREATE VIEW vw_Sales_All AS
SELECT * FROM Sales_History
UNION ALL
SELECT * FROM Sales_Current;
查詢優化器會自動對 Sales_History 走列存儲掃描,對 Sales_Current 走傳統求值,兼顧效能與寫入靈活性。
| 版本 | 關鍵突破 |
|---|---|
| 2012 | 首發,非叢集列存儲,表唯讀 |
| 2014 | 叢集列存儲(可更新)、批次模式擴展 |
| 2016 | 多列存儲索引、記憶體優化列存儲、運算元下推 |
| 2017/2019 | 列存儲上的計算欄位、有序列存儲、批次模式自適應聯結 |
列存儲索引是 SQL Server 邁向 HTAP(混合交易/分析處理)的關鍵基石。善用「熱冷分離 + 分區切換 + 叢集列存儲」,即可在保持 OLTP 寫入效能的同時,讓 OLAP 查詢跑上「高速公路」。