本文為「.NET 應用性能優化」系列第四篇,聚焦 SQL Server 的擴容策略、Schema 設計、查詢優化、索引策略、事務管理、執行計劃分析及部署運維實戰清單。
擴容策略:先優化,再 Scale Up,最後 Scale Out
- 優化優先:減少無效鎖、參數化查詢、優化索引,榨乾單機性能。
- 分離歷史/報表數據:歸檔唯讀歷史數據至獨立庫/數據倉庫,避免污染線上 OLTP 性能。
- Scale Up (縱向):升級 CPU、記憶體、磁盤 (啟用 /3GB、AWE),性價比最高。
- Scale Out (橫向):水平分表、分庫、復制、聯邦服務器,引入分佈式事務與運維複雜度,謹慎評估。
Schema 設計黃金法則
- 投入充分設計資源:上線前徹底建模測試,上線後修改代價極高。
- OLAP 與 OLTP 隔離:長查詢報表分流至專用報表庫/SSAS,不阻塞高併發事務。
- 先範式化,後反範式化:以 3NF 為基礎,針對熱點查詢引入冗余列/索引視圖優化讀性能。
- 完整定義 PK/FK/唯一約束/Check 約束:助力優化器生成最優計劃,利用 DRI (聲明式引用完整性) 替代觸發器實現級聯操作。
- 選型最窄適用類型:
smallint > int,避免隱式轉換殺死索引,慎用 sql_variant、text/ntext,優先 nchar/nvarchar (Unicode 環境)。
- 垂直/水平分表:冷熱列分離、按時間範圍分區,結合分區視圖或數據依賴路由。
查詢與索引實戰準則
- 只取所需列/行:禁用
SELECT *,大結果集強制分頁。
- 拒絕
NOT LIKE、<> 等 SARGable 反模式:優先 EXISTS/NOT EXISTS,避免列上加函數/隱式轉換。
- 鎖提示與隔離級別精準控制:
NOLOCK 讀不阻寫,UPDLOCK 防死鎖,批量更新用 TABLOCK 降低鎖開銷。
- 存儲過程/參數化查詢:防注入、計劃複用、邏輯分離。
- 索引策略:窄鍵聚簇索引、外鍵必建索引、高選擇性列建索引、核心查詢建覆蓋索引、複合索引首列放最強過濾列、移除未用索引。
事務與執行計劃管理
- 事務極短、晚獲取早釋放、統一訪問順序防死鎖、顯式 Commit/Rollback。
- 避免 DDL/DML 交織、游標操作臨時表導致重編譯;動態 SQL 用
sp_executesql。
- 定期分析執行計劃:消除 Table/Index Scan、評估 Hash Join/Bookmark Lookup/Sort 操作、對比實際 vs 估計行數 (更新統計信息)。
運維與部署檢查清單
- 預增長數據/日誌文件,禁用自動收縮,合理配置 RAID (TempDB 建議 RAID 0+1)。
- 分離數據/日誌/TempDB 至不同物理磁盤/控制器。
- 監控緩存命中率 (>90%)、可用內存、鎖/阻塞 (sp_lock, DMV)、長事務 (DBCC OPENTRAN)。
- 定期重建/整理索引碎片 (ONLINE 選項),建立 DBA 與開發反饋機制。