在開發與測試階段建立可重複、可度量的 SQL 優化流程,是交付高效能資料庫應用的關鍵。以下十步法源自 Oracle/ASE 體系,同樣適用於 SQL Server 環境 (對應工具為 Profiler / Extended Events)。
確保 TIMED_STATISTICS = TRUE (SQL Server 對應 SET STATISTICS TIME ON / Profiler 事件 SP:StmtCompleted 含 CPU/Duration)。
MAX_DUMP_FILE_SIZE 設為 Unlimited 或足大值,防止高負載下截斷關鍵事件。
定位 USER_DUMP_DEST (SQL Server 為 Profiler/XE 輸出路徑),確保磁碟剩餘空間充足,避免寫入失敗。
僅針對被測會話 (SPID) 開啟追蹤,減少雜訊。SQL Server 建議使用 Extended Events 取代舊版 Trace,效能負擔極低。
執行完整業務流程:登入、查詢、異動、報表等,涵蓋真實負載特徵。
依時間戳記與 SPID 找出對應的 .trc 或 .xel 檔案。
SQL Server 可用:
• sys.fn_trace_gettable 讀取 .trc → 匯入資料表分析
• SSMS 開啟 .xel 視覺化報表
• 第三方工具 (ClearTrace, ReadTrace, ApexSQL)
聚焦關鍵指標:
• Duration/CPU/Reads/Write 高的前 N 陳述句
• Execution Count 高且單次成本中等的「放大器」查詢
• 缺失索引建議、隱性轉換、參數嗅探痕跡
• 執行計畫:Scan vs Seek、排序溢出、平行度不當
採取針對性動作:
• 補索引 / 調整索引欄位順序 / INCLUDE 覆蓋索引
• 重寫查詢:消除隱性轉換、拆解複雜 OR/IN、改用 EXISTS/JOIN
• 更新統計資料 / 重建索引 / 強制參數化
• 調整隔離等級 / 鎖粒度 / 批次大小
優化非一次性動作。每輪優化後必須:
1. 清除計畫快取 (DBCC FREEPROCCACHE / 針對性 sp_recompile)
2. 重新追蹤
3. 對比關鍵指標 (Duration, CPU, Reads, Rows)
4. 確認無退化 (Regression) 才結案
| 步驟 | Oracle/ASE 傳統工具 | SQL Server 現代工具 |
|---|---|---|
| 4. 開啟追蹤 | SQL_TRACE / EVENT 10046 | Extended Events (system_health / 自訂 Session) |
| 7. 分析追蹤 | TKPROF | SSMS XE 報表 / sys.fn_xe_file_target_read_file / Query Store |
| 8. 找出昂貴查詢 | TKPROF 輸出排序 | Query Store / sys.dm_exec_query_stats / DMV 查詢 |
| 9. 計畫分析 | EXPLAIN PLAN | SSMS 實際執行計畫 / SET STATISTICS XML ON |