核心原則:最小化資料庫往返、最小化掃描範圍、最小化鎖持有時間
- 熱門靜態資料本地快取
部門、字典、下拉選單等啟動時一次載入至客戶端/中間層快取(Redis/MemoryCache),關閉才釋放。新增選項時通知重啟或熱更新。
- 分層快取策略
本地記憶體(L1)→ 分散式快取(L2,Redis)→ 資料庫。讀取時依序穿透,命中即返。寫入時雙寫或失效機制。
- 複雜邏輯下推存儲程序
多表聯查、分組彙總、遊標邏輯封裝在預存程序:
✅ 編譯優化、計畫重用
✅ 減少網路往返
✅ 臨時表隔離熱表鎖定
✅ 變數暫存中間結果避免重複查表
- Master-Detail 介面防抖
使用者在主表點擊切換行時,**若未換行(同一主鍵)不重新查詢明細**。單一客戶端可減 90% 以上重複查詢。
- 隱藏分頁/Tab 不載入資料
非可見區塊(TabControl 非活動頁、摺疊面板)延遲載入或不載入,切換時才觸發查詢。
- 自動刷新頻率動態調整
刷新間隔 = 基礎間隔 * (1 + 線上用戶數 / 基準用戶數)。
統計類報表改為**伺服器端排程彙總寫入摘要表**,客戶端只讀摘要表(1 分鐘 1 次 vs 100 客戶端每分鐘 100 次)。
- SQL Profiler / Extended Events 持續追蹤
開發/測試階段記錄實際執行 SQL、耗時、執行計畫,針對 Top N 耗時語句優化索引或改寫。
- 三層架構不解決資料庫存取問題
業務邏輯集中 ≠ 存取優化。仍需在 DAL 層實作快取、批次、分頁等模式。
- 避免複雜觸發器
觸發器隱式執行、難除錯、擴大交易範圍、導致鎖鏈。改用應用層事件發布/訂閱或排程同步。
- 預設限制回傳筆數(TOP N)
UI 預設 SELECT TOP 100,提供「顯示全部」核取方塊供管理員覆蓋。防止意外全表掃描拖垮伺服器。
- 只選需要的欄位
嚴禁 SELECT *,特別是含大型欄位(NVARCHAR(MAX), VARBINARY(MAX), XML)的表。投影下推減少 I/O 與網路傳輸。
- 不預載清單,改用條件查詢 + 歷史記憶
進入介面不自動載入列表;提供靈活篩選條件、最近使用記憶、常用快捷按鈕。高頻場景(如待辦工單)可預載最近 50 筆。
- 大量寫入時的索引策略
批次匯入前 DISABLE INDEX / DROP INDEX,匯入後 REBUILD;或使用 BULK INSERT + TABLOCK 最小化日誌。
伺服器端資源監控關鍵指標
| 指標 | 警戒閾值 | 對應行動 |
| CPU 使用率 | > 80% 持續 5 分鐘 | 檢查高耗 CPU 查詢、缺失索引、編譯重組 |
| 記憶體可用 | < 10% 總量 | 調整 Max Server Memory、檢查計畫快取膨脹 |
| 鎖等待時間 | avg wait > 500ms | 縮短交易、行版本控制 (RCSI)、分割熱點表 |
| TempDB 爭用 | PAGELATCH_UP 等待高 | 增加 TempDB 資料檔數量(CPU 核心數)、優化暫存表使用 |
總結:優化是系統工程,非單點技巧
從架構(快取層、讀寫分離)、應用(分頁、延遲載入、批次)、資料庫(索引、統計、分割、參數化)三層面系統性治理,才能在高併發下維持穩定低延遲。