首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 開發鐵律 21 條:從新手到專家的避坑指南

     編輯:關於SqlServer

前言

資料庫效能問題 80% 來自設計缺失而非硬體不足。這 21 條軍規蒐集自實戰慘痛教訓,適用 SQL Server 7.0 至最新版,核心精神:**正確性優先、效能次之、可維護性決定壽命**。

21 條鐵律詳細解析

  1. 精通工具箱:花一個週末瀏覽所有 T-SQL 命令、DMV、SSMS 報表、Profiler/Extended Events、Query Store。遇到問題時才想起「有這個功能」已太晚。
  2. 拒絕游標:集合思維替代逐列處理。WHILE @@FETCH_STATUS=0 1 萬列 = 1 萬次 SELECT,改寫為單一陳述式常快 100~1000 倍。極少數需逐列 (如動態 SQL 批次、外部 API 呼叫) 改用應用層或 CLR。
  3. 正規化至 3NF:反正規化是效能調優最後手段,非設計起點。先正規化、再依實測熱點精準去正規化 (檢視表/計算欄位/索引檢視表)。
  4. 禁用 SELECT *:減少網路/記憶體/IO、避免結構變更破壞應用、讓最佳化器利用覆蓋索引。明確列出欄位。
  5. 掌握存取模式再建索引:讀多寫少 → 覆蓋索引、篩選索引;寫多讀少 → 極小化索引、延遲建立。每個索引皆有維護成本 (INSERT/UPDATE/DELETE/REBUILD/統計更新)。
  6. 低選擇性欄位勿建索引:性別 (M/F)、布林、狀態碼 (少數值) 索引幾無幫助,反增維護負擔。複合索引遵循「高選擇性在前、等值查詢在前、範圍查詢在後、覆蓋欄位在最後」。
  7. 善用交易:多表異動、長耗時邏輯務必包裝交易。SET XACT_ABORT ON 確保嚴重錯誤自動回滾。避免交易過長 (鎖持有久、版本存儲膨脹)。
  8. 固定鎖定順序防死鎖:所有預存程序依相同順序存取表 (如 Parent → Child)。死鎖難重現、難除錯,預防勝於治療。
  9. 拒絕大結果集回傳給 UI:下拉選單 10 萬列 = 使用者崩潰。分頁、搜尋、虛擬滾動、最多 100~200 列/頁。
  10. 用戶端游標優於伺服器端:ADO/ADO.NET ClientCursor 減少伺服器鎖持有、網路往返、記憶體壓力。
  11. 參數化查詢 (Parameterized Queries):WHERE Name = @Name 而非字串拼接。防注入、計畫重用、避免隱含轉換、參數嗅探可控。
  12. 開發環境用真實資料量:100 列測試通過 ≠ 1 億列上線安全。定期從生產匿名化同步資料至開發/測試環境。
  13. 大量匯入用 BCP/SSIS/INSERT...SELECT,非逐列 INSERT:INSERT ... VALUES 迴圈 = 慢、記錄暴增、鎖爭用。最小記錄、批次、平行。
  14. 設定合理 Command Timeout:預設 30 秒常不夠。依據 P99 執行時間設定 (如 120~300 秒),並監控逾時率。
  15. 樂觀並發處理同時修改:ROWVERSION (Timestamp) 欄位 + WHERE RowVer = @OldRowVer,衝突則重讀合併或提示使用者。
  16. 身分值取用用 SCOPE_IDENTITY():@@IDENTITY 受觸發器干擾、IDENT_CURRENT 受並發影響。SCOPE_IDENTITY() 為當前範圍最後身分值,最安全。
  17. 能 NOT NULL 就 NOT NULL:NULL 需額外位元組儲存、三值邏輯 (TRUE/FALSE/UNKNOWN) 複雜化查詢、索引統計準確度下降。業務允許空值時改用預設值/檢視表/稀疏欄位 (SPARSE)。
  18. 慎用 TEXT/NTEXT/IMAGE (已淘汰):改用 VARCHAR(MAX)/NVARCHAR(MAX)/VARBINARY(MAX),支援完整字串函數、索引、壓縮、記憶體優化。
  19. 少用暫存表 (#temp),改用表變數 / CTE / 內聯 TVF:暫存表造成重編譯、鎖定系統表、連線池殘留。表變數 (小資料)、CTE (邏輯清晰)、內聯 TVF (可重用) 更優。
  20. 精通查詢計畫分析:SSMS 實際執行計畫 (Ctrl+M) 識別:Table Scan、Key Lookup、Sort、Hash Match、Parallelism、Missing Index、Parameter Sniffing、Statistics Stale。SET STATISTICS IO, TIME ON 量化 IO/CPU。
  21. 宣告參考完整性 (PK/FK/UNIQUE/CHECK):資料庫層級守護資料品質,最佳化器利用約束推導統計、簡化計畫、消除冗余連結。應用層驗證不可替代資料庫約束。

速查卡:開發前檢查清單


[ ] 所有表有 PK、適當 FK、CHECK 約束
[ ] 索引依存取模式建立、無重複/未使用索引 (sys.dm_db_index_usage_stats)
[ ] 無 SELECT *、無游標、無純量 UDF 在大查詢 SELECT 清單
[ ] 所有動態 SQL 參數化、無字串拼接
[ ] 交易範圍最小化、XACT_ABORT ON
[ ] 大量異動分批、最小記錄、簡單復原模式
[ ] 命名規範:表 PascalCase、欄位 camelCase、PK_FK_CK_IX 前綴
[ ] 文件化:資料字典、ER 圖、存取模式、已知限制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved