查詢緩慢十大常見成因
- 缺少索引或未用到索引(程式設計缺失,最常見)
- I/O 吞吐量不足,形成瓶頸
- 缺少計算欄位導致查詢無法優化
- 記憶體不足
- 網路速度慢
- 查詢回傳資料量過大(可採多次查詢或分頁降低單次負載)
- 鎖競爭或死鎖(程式設計缺失,最常見)
- sp_lock/sp_who 觀察活躍用戶,發現讀寫資源競爭
- 回傳不必要的欄位與列
- 查詢語句本身未優化
優化策略與具體作法
1. 存儲架構分離:資料、日誌、索引放不同 I/O 設備
資料量越大,I/O 優化越關鍵。舊版建議 Tempdb 放 RAID 0,SQL 2000 不再支援。
2. 資料表縱向與橫向分割
使用 sp_spaceuse 監控表大小,垂直拆分熱冷欄位,水平按範圍/雜湊分區。
3. 硬體升級
CPU、記憶體、磁碟陣列按瓶頸補強。
4. 索引優化核心原則
- 依查詢條件建立索引,優化存取路徑,限制結果集大小。
- 填充因子建議使用預設值 0。
- 索引鍵越小越好,優先用位元組數少的欄位。
- 避免對低基數欄位(如性別)建單一索引,選擇性太差優化器不會使用。
5. 網路優化
提升頻寬、降低延遲,必要時啟用壓縮協定。
6. 記憶體配置最佳實踐
- Win 2000 + SQL 2000 支援 4-8GB 實體記憶體。
- 虛擬記憶體 = 實體記憶體 × 1.5 倍。
- 若啟用全文檢索,虛擬記憶體 ≥ 實體記憶體 × 3 倍。
max server memory 設為虛擬記憶體一半(即實體 × 1.5)。
7. CPU 並行處理
- 增加 CPU 核心數,但並行處理比串行需更多記憶體資源。
- 並行與否由 SQL Server 自動評估:複雜排序、聯結、掃描、GROUP BY 適合並行;UPDATE/INSERT/DELETE 目前不支援並行。
8. LIKE 查詢與全文索引
LIKE 'a%' 可用索引;LIKE '%a'、LIKE '%a%' 無法使用一般索引。
LIKE '%a%' 耗時與欄位總長度成正比,長字串欄位應用 VARCHAR 而非 CHAR。
- 長文本欄位建立全文索引(佔空間但查詢快)。
9. 架構分離:DB Server / App Server 分離;OLTP / OLAP 分離
10. 分散式分區檢視表實作資料庫聯盟
步驟:① 水平分區資料表 → ② 各成員伺服器建立同名分散式分區檢視表。查詢可在任一節點執行,資料位置對應用透明。
11. 維護作業自動化
- 重建索引:
DBCC REINDEX、DBCC INDEXDEFRAG
- 收縮資料/日誌:
DBCC SHRINKDB、DBCC SHRINKFILE
- 設定日誌自動收縮;大型資料庫勿啟用自動增長,會嚴重拖慢效能。
T-SQL 撰寫關鍵要點
DBMS 查詢計劃處理流程
- 詞法/語法檢查
- 提交查詢優化器
- 代數優化 + 存取路徑優化
- 預編譯模組生成查詢計劃
- 適時提交執行
- 回傳結果
SQL Server 資料儲存結構
- 頁面大小 8KB (8060 位元組可用)
- 8 頁 = 1 區Extent
- 採 B-Tree 結構組織