| 1 | WHERE 限制回傳行數 | 避免全表掃描,大表掃描期間鎖表阻塞其他存取 |
| 2 | 避免游標 | 改用客戶端迴圈、暫表、Table 變數、子查詢、CASE 陳述式 |
| 3 | UNION ALL 替代 UNION | UNION 需排序去重,ALL 直接合併,效能差異大 |
| 4 | 慎用 DISTINCT / ORDER BY | 可移至客戶端處理,減少伺服器排序開銷 |
| 5 | LIKE 模式索引利用 | LIKE 'a%' 用索引;LIKE '%a'、LIKE '%a%' 全掃描 → 長字串改全文索引 |
| 6 | 欄位運算移至等號右側 | WHERE SUBSTRING(name,1,1)='m' → WHERE name LIKE 'm%' |
| 7 | IN/OR 拆解為 UNION ALL | 多 OR 條件未用索引時,改寫 UNION ALL 再嘗試匹配索引 |
| 8 | 指定索引提示 | SELECT * FROM Table (INDEX=IX_Name) WHERE col IN (...) |
| 9 | 預先計算結果存表 | 複雜報表/費用計算預聚合,查詢時直接 SELECT |
| 10 | MIN/MAX 善用索引 | 合適索引下極值查詢極快 |
| 11 | 程式碼貼近資料 | 優先順序:Default → Rule → Trigger → Constraint → Procedure |
| 12 | 大二進位用預存程序 | 避免應用層雙向轉換(二進位↔字串),直接傳參數 |
| 13 | BETWEEN 優於 IN | 範圍查詢索引定位更快 |
| 14 | 臨時表索引視情況建立 | 索引也消耗資源,非必然提升 |
| 15 | 必要時才用事務 | 報表查詢勿加事務,浪費鎖資源 |
| 16 | 視圖慎用、禁嵌套 | 視圖本質為優化後 SQL,嵌套增加解析開銷;單表查詢直取基表 |
| 17 | IN 列表頻繁值前置 | 減少判斷次數 |
| 18 | 避免 SELECT INTO 鎖系統表 | 建表用明確 CREATE TABLE;事務中禁用 SELECT INTO |
| 19 | GROUP BY/HAVING 後置 | WHERE 先篩選 → GROUP BY 分組 → HAVING 篩選分組 |
| 20 | 批次更新優於逐筆 | 單一 UPDATE 多列優於多次 UPDATE |
| 21 | Table 變數替代臨時表 | 輕量、無鎖系統表、自動清理 |
| 22 | 計算欄位可索引 (2000+) | 需確定性運算式、非 LOB 型別、ANSI_NULLS/PADDING ON |
| 23 | 邏輯運算下推伺服器 | 用預存程序減少網路往返;UDF 回傳大結果集改用預存程序 |
| 24 | 重複函數呼叫提取變數 | 避免重複計算 |
| 25 | COUNT(*) 效能低 | 改用 EXISTS;注意 COUNT(nullable) vs COUNT(not null) 結果不同 |
| 26 | 執行緒池配置 | 記憶體足:執行緒=最大連接+5;否則啟用執行緒池 |
| 27 | 固定鎖定順序防死鎖 | 所有預存程序依相同順序鎖表(先 A 後 B) |