| 型態 | 儲存大小 | 精度/範圍 | 優勢 |
| date | 3 bytes | 0001-01-01 ~ 9999-12-31 | 純日期,無時間,索引更小、比較更快 |
| time(n) | 3-5 bytes | 00:00:00.0000000 ~ 23:59:59.9999999 | 純時間,可指定小數秒精度 |
| datetime2(n) | 6-8 bytes | 同 datetime 但精度 100ns | 更大範圍、更高精度、可變長度 |
| datetimeoffset(n) | 8-10 bytes | 含時區位移 | 全球化應用必備,避免時區轉換錯誤 |
- 舊函數 (
GETDATE(), DATEADD 等) 相容新型態;新增 SYSDATETIME(), SYSUTCDATETIME(), SYSDATETIMEOFFSET() 提供高精度。
- 精確使用
date/time 可節省儲存、縮小索引、消除 T-SQL 格式轉換開銷。
2. 篩選索引
CREATE NONCLUSTERED INDEX IX_Orders_ActiveCustomer
ON Sales.Orders (CustomerID)
WHERE Status = 'Active' AND OrderDate >= '2023-01-01';
- 僅為符合
WHERE 條件的資料列建立索引,大幅縮小索引體積。
- 特別適合 Sparse Column(大量 NULL)場景。
- 統計資訊更精準(僅針對子集),優化器基數估計更準確。
- 維護成本降低(DML 僅影響符合條列的列)。
3. MERGE 語法
MERGE INTO TargetTable AS T
USING SourceTable AS S
ON T.KeyCol = S.KeyCol
WHEN MATCHED THEN UPDATE SET T.Col = S.Col
WHEN NOT MATCHED BY TARGET THEN INSERT (KeyCol, Col) VALUES (S.KeyCol, S.Col)
WHEN NOT MATCHED BY SOURCE THEN DELETE;
- 符合 ANSI SQL 2006 標準並延伸。
- 單一陳述式完成 UPSERT (INSERT/UPDATE/DELETE),隱含交易原子性。
- 來源資料重複匹配目標時直接報錯,避免
UPDATE FROM JOIN 的非確定性行為。
- 同步兩表僅需 一次 JOIN 比對,傳統寫法需三次 (INSERT/UPDATE/DELETE 各一次)。
三、遷移與相容性提醒
datetime/smalldatetime 仍支援,新開發優先用新型態。
- 篩選索引無法在
WHERE 使用非確定性函數、參數、子查詢。
MERGE 需相容性層級 100 (SQL Server 2008) 以上。
- Resource Governor 需 Enterprise,Standard/Web/Express 不支援。
結語
SQL Server 2008 以「管理自動化、資源可控、開發現代化」三大支柱,回應資料量質雙增的挑戰。Policy-Based Management 讓合規可落地,Resource Governor 讓多租戶共存可控,新型態/篩選索引/MERGE 讓開發更高效。這些特性在後續版本持續演進(如 2016+ 彈性資源池、2019+ 智能查詢處理),奠定了現代 SQL Server 效能工程的基石。
- 上一篇文章: SQL Server 帶參數預存程序執行:SqlHelper.ExecuteNonQuery 參數化實作範例
- 下一篇文章: 應用技巧:用 SQL Server 判斷閏年的高效函數
Copyright ©
程式碼之家 All Rights Reserved