| 規則 | 說明 | 反例 → 正例 |
| 避免大交易 | 縮短鎖持有時間,提升並發 | 單一 SP 處理 10 萬行 → 分批/非同步處理 |
| 慎用 HOLDLOCK | 等同 SERIALIZABLE,極大降低並發 | 改用樂觀鎖 / RowVersion |
| 減少重複存取大表 | 先篩選至暫存表/表變數,再 JOIN | `JOIN` 百萬表三次 → `#tmp` 篩選後 JOIN |
| 避免游標 | 集合操作優於逐行處理 | 游標迴圈 UPDATE → 單一 `UPDATE ... JOIN` |
| WHERE 條件順序 | 依索引欄位順序、選擇率高低排序 | `WHERE col2=? AND col1=?` (索引 col1,col2) → 調整順序 |
| 索引欄位不運算 | `WHERE col+1=10` 失效索引 | `WHERE col=9` |
| EXISTS 代替 COUNT | `EXISTS` 半連接、遇真即停 | `IF (SELECT COUNT(*) ...) > 0` → `IF EXISTS(...)` |
| `>=` 優於 `>` | 可用索引 Seek 而非 Scan | `WHERE id > 100` → `WHERE id >= 101` |
| OR 改 UNION/IN | OR 往往導致掃描 | `WHERE a=1 OR a=2` → `WHERE a IN (1,2)` |
| 資料型別一致 | 隱含轉換殺死索引 | `WHERE varchar_col = 123` → `WHERE varchar_col = '123'` |
| 控制 INSERT/UPDATE 批次大小 | 超過 200 頁 (400KB) 觸發鎖升級為表鎖 | 分批提交、啟用資料列鎖 |