長期從事預存程序 (SP) 開發,整理出一套開發規範與優化原則,主要針對 Sybase 與 SQL Server,其他關聯式資料庫亦具參考價值。優化前後效能差距可達數百倍。
database.dbo.table_name,因 sp_depends 無法追蹤跨庫相依,影響驗證。SET SHOWPLAN ON 分析查詢計劃,自行完成查詢優化檢查。| 項目 | 建議做法 | 避免做法 |
|---|---|---|
| 大型交易 | 拆解為小批次 | 長時間持有鎖、濫用 HOLDLOCK |
| 重複存取大表 | 先依條件篩選進暫存表,再做 JOIN | 多次直接 JOIN 大表 |
| 游標 | 能用集合操作就不用游標;超過 1 萬列必須改寫 | 游標迴圈中再做表連接 |
| WHERE 條件順序 | 依索引順序、選擇性由高到低排列 | 隨意排列、忽略索引順序 |
| WHERE 運算 | 運算放在右側常數 | 左側欄位做函數/運算(導致索引失效) |
| 存在性判斷 | EXISTS | SELECT COUNT(1)(全表掃描) |
| 範圍比較 | >= | >(可能多一次索引搜尋) |
| OR / UNION | 視情況互換,配合索引 | 固定寫法不思考 |
| 資料型別一致 | JOIN 欄位型別一致 | 隱含轉換導致索引失效 |
| 參數與欄位型別 | 參數型別對應欄位 | 型別不符觸發隱含轉換 |
| 大量 DML | 分批次、避免超過 200 頁 (400KB) 觸發鎖升級 | 單次大量 INSERT/UPDATE |
INDEX index_name 強制指定sp_recompile)DISTINCT, ORDER BY, GROUP BY, HAVING, JOIN, COMPUTE 等加重 tempdb 負擔的操作