開發一個應用系統或許不難,但要讓系統發揮最佳效能卻是一門深度學問。從開發工具、資料庫設計、應用架構、查詢設計到介面選擇,每個環節都有多種方案,選擇取決於具體業務需求與團隊技術棧。本文以 SQL Server 為例,從後端資料庫角度深入探討應用程式效能優化技巧,並提供實戰建議。
在 SQL Server 方案中實現最優效能,最關鍵的是擁有優秀的資料庫設計方案。實務中,許多效能不佳的案例根源於資料庫設計缺陷。良好的設計必須考量以下核心問題。
一般邏輯設計滿足前三範式:
遵循範式可減少資料冗餘與儲存頁數,但可能導致複雜的多表關聯(Join),降低查詢效能。適度的反正規化能提升效能,經驗證有效的策略包括:
正確選擇物理策略需了解存取模式與硬體特性(記憶體、磁碟 I/O 子系統)。關鍵準則:
smallint 就別用 int,可加快索引讀取、單頁容納更多列、減少 I/O。SQL Server 硬體平台包含處理器、記憶體、磁碟子系統、網路四大面向。
依負載估算 CPU 需求。最低建議 Pentium/100(僅 2-3 用戶),關鍵應用或多用戶環境推薦 Pentium Pro 或 Pentium II 等級。
記憶體配置對效能至關重要。SQL Server 用於程序快取、資料/索引快取、伺服器靜態開銷。最大可用 2GB 虛擬記憶體。Windows NT 為每個 Win32 應用提供 4GB 虛擬位址空間,由 VMM 映射至實體記憶體。若虛擬記憶體超過實體記憶體,效能將下降。同主機運行其他服務(檔案列印、應用伺服器)亦佔用記憶體。基準建議:至少 32MB(NT 佔 16MB),每併發用戶 +100KB。例如 100 用戶需 42MB 以上。增加記憶體是提升效能最具成本效益的途徑。
優秀的磁碟 I/O 系統是高效能關鍵。推薦智慧型 SCSI-2 控制器或磁碟陣列控制器,特性包括:控制器高速快取、總線主機處理器減少 CPU 中斷、非同步讀寫、32-bit RAID 支援、快速 SCSI-2 驅動器、預讀快取(至少一磁軌)。
硬體就緒、資料庫設計完成、掌握業務需求後,進入查詢與索引設計。兩大核心:依據優化器知識生成查詢/索引;利用 SQL Server 效能特性強化存取。
SQL Server 使用基於成本的查詢優化器,自動優化含 WHERE 或 HAVING 的 SELECT、DELETE、UPDATE。透過 SHOWPLAN 可觀察執行計畫。優化三階段:
<> 等排斥運算子的子句無法優化,只能全表掃描。UPDATE/INSERT/DELETE,所有索引皆須調整並記錄於交易記錄。WHERE 子句欄位極可能成為索引欄位。ORDER BY/GROUP BY 的欄位適合叢集索引;有叢集索引的 ORDER BY 避免工作表產生。目標:最小化物理/邏輯 I/O,平衡 CPU 與 I/O 時間。關鍵建議:
WHERE 子句:唯一索引上 = 最佳,其次封閉區間,再開放區間。OR/IN,優化器可能採 R 策略產生工作表(動態索引),增加開銷。NOT、<>、!= 的子句無法利用索引選擇,因為是排斥操作。paycheck * 12 > 36000 改寫為 paycheck > 36000/12;substring(lastname,1,1)='L' 改為 lastname LIKE 'L%'。tempdb 大小;常見操作可將 tempdb 置於 RAM。影響因素遠不止以上:作業系統檔案系統選擇、網路協定、開啟服務、SQL Server 優先權等皆有影響。因應用各異,無通用優化方案,需在開發維護過程中持續依運行情況調整。絕大部分優化工作在獨立伺服器上進行,現實可行。