SQL Server 查詢緩慢是資料庫管理最常見的痛點。本文系統性整理 10 大常見效能瓶頸成因,並提供 11 類具體優化策略,涵蓋索引、I/O、記憶體、網路、平行處理、分割表、分散式架構等層面,協助 DBA 與開發人員建立完整優化思維。
一、 查詢緩慢十大常見成因
- 缺少索引或未用到索引:程式設計缺失,導致全表掃描。
- I/O 吞吐量不足:磁碟子系統成爲瓶頸。
- 缺乏計算欄位:查詢無法利用索引最佳化。
- 記憶體不足:緩衝區命中率低,頻繁磁碟交換。
- 網路延遲:客戶端與伺服器傳輸耗時過長。
- 回傳資料量過大:應採分頁、分批查詢或篩選縮減結果集。
- 鎖定/死結:並發控制不當,資源競爭嚴重。
- 阻塞鏈分析:善用
sp_lock、sp_who、活動監視器定位阻塞頭。
- 回傳不必要的欄位/列:避免
SELECT *,明確指定所需欄位。
- 查詢語句撰寫不佳:缺乏最佳化邏輯、不當聯結順序、函數包裹導致 SARGable 失效。
二、 十一大優化策略實作
1. 物理檔案佈局分離:資料、記錄、索引、Tempdb
- 將
.mdf (資料)、.ldf (記錄)、非叢集索引檔案群置於不同實體磁碟/RAID 群。
Tempdb 建議置於高速儲存 (NVMe/RAID 0/10),預設 8 個資料檔案減少 PFS/GAM/SGAM 爭用。
- 資料量越大,I/O 隔離效益越明顯。
2. 資料表垂直/水平分割
- 垂直分割:將大型欄位 (BLOB、長文字) 移至獨立表,核心表保持窄而快。
- 水平分割 (分區表):依範圍 (日期、區域) 分散資料至不同檔案群,配合分區消除大幅縮減掃描範圍。
- 使用
sp_spaceuse 監控表大小與碎片。
3. 硬體升級:CPU、記憶體、儲存
- CPU:核心數提升平行查詢能力 (注意
MAXDOP 設定)。
- 記憶體:64 位元版本突破 4GB 限制,配置
max server memory 保留 OS 記憶體。
- 儲存:全閃存陣列 (All-Flash) 或 NVMe 大幅降低延遲。
4. 索引設計黃金法則
- 依查詢
WHERE、JOIN、ORDER BY 欄位建立索引,優先考慮叢集索引鍵選擇性 (唯一、窄、遞增)。
- 填充因子預設 0 (100%) 適合唯讀/少更新;高更新表設 70-90% 減少分頁分割。
- 索引鍵越窄越好 (優先
int > bigint > char > varchar)。
- 避免低選擇性欄位建單一索引 (如性別、狀態碼),改用篩選索引或複合索引前導欄位。
- 定期
DBCC INDEXDEFRAG / REBUILD 維護碎片。
5. 記憶體與虛擬記憶體精準配置
-- 虛擬記憶體 = 物理記憶體 x 1.5 倍 (純 SQL)
-- 啟用全文檢索 = 物理記憶體 x 3 倍
-- max server memory = 虛擬記憶體 / 2 ≈ 物理記憶體 x 1.5
- 鎖定記憶體頁面 (Lock Pages in Memory) 防止 OS 交換 SQL 緩衝區至磁碟。
6. 平行處理策略與限制
- SQL Server 自動評估平行度 (DOP),複雜掃描、排序、雜湊聯結、GROUP BY 受益最大。
- UPDATE/INSERT/DELETE 不支援平行執行 (僅查詢支援)。
- 透過
MAXDOP (伺服器/查詢層級) 控制最大平行度,避免過度平行導致排程器壓力。
- 平行處理需更多記憶體 (交換緩衝區),記憶體壓力下反而拖慢效能。
7. LIKE 查詢與全文檢索權衡
LIKE 'abc%' 可用索引搜尋;LIKE '%abc' / LIKE '%abc%' 必須掃描。
- 長字串模糊比對成正比於欄位總長度 → 改用
VARCHAR 而非 CHAR。
- 大量文字搜尋需求 → 採用 全文檢索 或 語意搜尋 (SQL 2012+),雖佔空間但查詢極快。
8. 架構層級分離:DB Server vs App Server、OLTP vs OLAP
- 資料庫伺服器專職處理資料邏輯,應用伺服器處理業務邏輯,資源隔離互不干擾。
- 交易系統 (OLTP) 與分析系統 (OLAP) 分離部署,避免長跑報表查詢阻塞線上交易。
9. 分散式分區檢視表:建立伺服器聯盟
- 水平分割資料表 → 每個成員伺服器建立相同結構的成員表 + 相同名稱的分散式分區檢視表。
- 應用程式透明存取,資料位置透明化,支援大型多層 Web 站點擴展。
- 參考《設計聯合資料庫伺服器》文件深入實作。
10. 維護作業自動化:重建索引、收縮檔案
DBCC REINDEX / INDEXDEFRAG 定期整理碎片。
DBCC SHRINKDB / SHRINKFILE 謹慎使用 (會產生碎片),大型資料庫嚴禁啟用自動增長/自動收縮,預先規劃檔案大小。
- 記錄檔設定簡單復原模式 + 定期
BACKUP LOG 截斷,或完整模式 + 高頻記錄備份。
11. 統計資訊同步更新