這 21 條原則源自實戰教訓,適用於 SQL Server 專案,多數亦通用於其他關聯式資料庫。
核心 21 條
- 熟知工具箱:花一個週末瀏覽所有 T-SQL 命令與 SSMS 功能。遇到問題時能想起「有個命令能解決」,再查語法即可。
- 拒絕游標:游標 = 逐列處理 = 效能殺手。10 萬列游標 40 分鐘 → 集合操作 10 秒。若必須迴圈,改用應用層批次處理。
- 正規化資料表:第三正規化 (3NF) 為基準。反正規化僅在證實效能瓶頸且經測試驗證後進行,否則常適得其反。
- 禁用 SELECT *:明確列出欄位 → 減少網路/記憶體、啟用覆蓋索引、結構變更時易維護。
- 理解存取模式再建索引:讀多寫少 → 多索引;寫多讀少 → 少索引。每個索引皆增加 INSERT/UPDATE/DELETE 成本。
- 低基數欄位勿建索引:如「性別」(M/F) 只有兩值,索引無助篩選。複合索引順序:高基數在前 (姓名 + 縣市 + 性別)。
- 善用交易:長跑查詢務必包裹交易,異常時自動回滾保護一致性。
- 防死鎖:固定存取順序:所有預存程序以相同順序鎖定資源 (如先 TableA 再 TableB),消除循環等待。
- 拒絕大結果集直送前端:使用者不看 10 萬列。分頁、搜尋、篩選、僅回傳 Top N。
- 客戶端游標優於伺服器端:減少伺服器記憶體/鎖壓力、縮短鎖持有時間。
- 參數化查詢 (Prepared Statements):防注入、計畫重用、型別安全。絕不拼接字串。
- 開發環境使用實量級測試資料:硬碟便宜,效能問題早發現早解決。生產資料量級測試是基本職業素養。
- 大量匯入用 BCP/BULK INSERT/SSIS:逐列 INSERT 極慢、日誌暴增。最小記錄模式下 BULK INSERT 快 10-100 倍。
- 設定合理命令逾時:預設 15-30 秒常不足。依查詢複雜度調整,避免誤判截斷長跑報表。
- 處理並發更新衝突:加
ROWVERSION/TIMESTAMP 欄位,更新前比對,衝突則提示使用者重試/合併。
- 細節表新增勿用 MAX(ID)+1:併發下必重複。用
IDENTITY、SEQUENCE (2012+)、SCOPE_IDENTITY() 取回值。
- 能 NOT NULL 就 NOT NULL:NULL 需額外儲存位元組、查詢需
IS NULL 判斷、三值邏輯易出 Bug。業務允許空值時再用 NULL。
- 慎用 TEXT/NTEXT/IMAGE (已棄用):改用
VARCHAR(MAX)/NVARCHAR(MAX)/VARBINARY(MAX),支援完整查詢、索引、壓縮。
- 暫存表慎用:優先考慮 CTE、衍生表、TABLE 變數。暫存表導致重編譯、連線池殘留、TempDB 壓力。
- 精通執行計畫分析:SSMS「顯示預估/實際執行計畫」是最強免費調優工具。讀懂 Scan/Seek、Join 類型、估算 vs 實際列數。
- 宣告參考完整性:PK、FK、UNIQUE、CHECK 條件約束讓引擎保護資料品質,省去應用層大量防禦性代碼。
速查卡
☐ 無游標
☐ 3NF 基準
☐ 無 SELECT *
☐ 索引匹配存取模式
☐ 參數化查詢
☐ 實量測試資料
☐ BULK 匯入
☐ 合理逾時
☐ 樂觀鎖 (ROWVERSION)
☐ IDENTITY/SEQUENCE
☐ NOT NULL 預設
☐ VARCHAR(MAX) 替代 TEXT
☐ CTE > 暫存表
☐ 讀懂執行計畫
☐ PK/FK/CHECK 全上
將這 21 條內化為團隊編碼規範、Code Review 清單、CI 門檻,資料庫層級事故可減少 80% 以上。