查詢效能調優是系統工程,可歸納為五層倒金字塔,優化收遞遞減:
- 減少資料訪問(核心):建立合適索引,將掃描轉為尋找,效能提升 100-1000 倍。如字典有拼音索引可直達目標字。
- 減少回傳資料量:網路頻寬有限,嚴禁
SELECT *,按需選欄位。
- 減少資料庫交互次數:使用預存程序、批次語句,降低網路往返開銷。
- 降低 CPU 負載:參數化查詢復用執行計劃,避免重複編譯。
- 提升硬體效能(最後手段):CPU、記憶體、磁碟瓶頸解除前,優化軟體層面更划算。
索引兩大類型與選擇原則
- 叢集索引:決定資料物理順序,每表僅一個。適合範圍查詢、排序、分組、連接鍵。鍵值應窄、唯一、穩定(避免身份列熱點)。
- 非叢集索引:邏輯順序與物理順序分離,透過書籤查找(叢集鍵或 RID)回表。叢集表上非叢集索引走叢集鍵,堆表走 RID,前者效能優。
索引設計黃金法則
- 資料列 > 300 行才考慮建索引。
- 叢集索引首選單欄、唯一、窄欄位(代理鍵最佳)。
- 多欄位 WHERE 條件用組合索引,高選擇性欄位前置;低選擇性欄位(如性別)不建索引。
- 覆蓋索引:查詢欄位全含索引中,避免回表掃描。
- 頻繁寫入表慎建過多索引,維護成本會抵消查詢收益。
- 定期重建索引、更新統計資訊,防止碎片與統計過期誤導優化器。
主鍵預設建叢集索引,若需非叢集主鍵須顯式指定 PRIMARY KEY NONCLUSTERED。複合主鍵更需謹慎規劃叢集鍵選擇。