版本演進時間軸
- SQL Server 2008:引入表值參數、MERGE、GROUPING SETS、行建構器
- SQL Server 2008 R2:少量調整
- SQL Server 2012:欄存索引、大物件線上重建索引、FORCESEEK/FORCESCAN 提示
SQL Server 2008 關鍵特性
1. 表值參數 (Table-Valued Parameters, TVP)
- 將多列資料打包成單一參數傳遞,減少往返
- 不需建立暫存表、不需大量標量參數
- 讀取無鎖、支援排序順序
- 使用流程:建立使用者定義表類型 → SP 參數使用該類型 → 呼叫端宣告表變數填資料 → 傳入 SP
2. MERGE 陳述式
- 單一陳述式完成 INSERT/UPDATE/DELETE (UPSERT)
- 適用:兩表同步、資料倉庫 ETL、緩慢變維度 (SCD)
- 配合適當索引可大幅減少掃描
3. GROUPING SETS
- 單一查詢產生多種群組彙總 (替代多次 GROUP BY + UNION ALL)
- 減少 I/O、記憶體、執行時間
- 範例:
GROUP BY GROUPING SETS ((A,B), (A), (B), ())
4. 行建構器 (Row Constructors)
- 單一 INSERT 插入多列:
VALUES (v1,v2), (v3,v4), ...
- 每陳述式最多 1000 列
- 減少網路流量、客戶端處理時間、交易次數
- 實測:10 批 × 1000 列 = 10000 列,整體時間降低 50%+
SQL Server 2012 關鍵特性
1. 欄存索引 (Columnstore Index)
- VertiPaq 架構:欄導向儲存、高壓縮、批次模式處理
- 資料倉庫查詢加速 10x~1000x
- 限制:表變唯讀 (2012),2014+ 支援可更新叢集欄存索引
- 不支援型別:LOB、MAX 型別、CLR、XML、高精度 decimal、timestamp
2. 大物件 (LOB) 線上重建索引
- 2008 R2 及之前:
VARCHAR(MAX), NVARCHAR(MAX), VARBINARY(MAX), XML 無法線上重建
- 2012:支援
ALTER INDEX ... REBUILD WITH (ONLINE = ON) 對 LOB 欄位
- 消除維護視窗限制、提升可用性
3. FORCESCAN 查詢提示
- 優化器低估列數誤選 Index Seek 時,強制 Index Scan
- 適用:小表掃描比 Seek 快、參數嗅探導致計畫不穩
總結
每個版本都帶來實質效能提升工具。2008 解決參數傳遞、UPSERT、彙總、批次插入痛點;2012 以欄存索引重新定義分析型查詢效能。升級版本即獲得效能紅利,配合應用層改寫效果最大。