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

SQL Server 預存程序開發與效能優化規範:從編碼標準到索引、TempDB、演算法全方位指南

     編輯:關於SqlServer

前言:SP 是業務邏輯與資料存取的核心封裝層

專案中 SP 數量龐大、邏輯複雜,缺乏規範會導致**維護困難、效能參差、Bug 頻發**。本文沉澱實戰經驗,建立從編寫到優化的完整規範體系。

一、編碼與架構規範

  1. 跨資料庫存取:嚴禁直接 `Database.dbo.Table`,**在當前資料庫建立 View 封裝跨庫查詢**,利於 `sp_depends` 追蹤相依性。
  2. 提交前自查:必須執行 `SET SHOWPLAN ON` / `SET STATISTICS IO ON` 分析執行計畫、邏輯讀,自行優化通過後再提交。
  3. 命名規範:`usp_模組_動作_對象` (如 `usp_Order_Create_Header`),輸入參數 `@p_` 開頭,輸出 `@o_`,區域變數 `@v_`。
  4. 錯誤處理:統一 `TRY...CATCH` 結構,記錄錯誤上下文至日誌表,回傳統一錯誤碼。

二、SQL 撰寫效能鐵律

規則說明反例 → 正例
避免大交易縮短鎖持有時間,提升並發單一 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/INOR 往往導致掃描`WHERE a=1 OR a=2` → `WHERE a IN (1,2)`
資料型別一致隱含轉換殺死索引`WHERE varchar_col = 123` → `WHERE varchar_col = '123'`
控制 INSERT/UPDATE 批次大小超過 200 頁 (400KB) 觸發鎖升級為表鎖分批提交、啟用資料列鎖

三、索引設計與維護規範

  • OLTP 大表 **索引數 ≤ 6**,權衡寫入開銷。
  • 優先使用 **叢集索引** (範圍查詢、排序、分組);非叢集索引覆蓋高頻查詢欄位 (Covering Index)。
  • 複合索引**首欄必須出現在 WHERE/JOIN/ORDER BY**,否則索引失效。
  • **週期性維護**:
    `ALTER INDEX ALL ON Table REBUILD WITH (ONLINE=ON, FILLFACTOR=80)`
    `UPDATE STATISTICS Table WITH FULLSCAN`
    `sp_recompile 'ProcName'` (重新編譯 SP 套用新統計)
  • 監控 `sys.dm_db_index_usage_stats` 移除未使用索引。

四、TempDB 使用鐵律

五、演算法選擇與調優工具

  • 同一業務邏輯**設計 2-3 種 SQL/演算法變體**,用實測數據決策。
  • 核心調優命令:
    `SET STATISTICS IO ON` (邏輯/物理讀)
    `SET STATISTICS TIME ON` (CPU/經過時間)
    `SET SHOWPLAN_XML ON` (完整計畫)
    `DBCC FREEPROCCACHE` / `DBCC DROPCLEANBUFFERS` (淨室測試)
  • 關注指標:**邏輯讀 (Logical Reads) 是衡量查詢效率核心指標**,物理讀受快取影響大。

結語

優秀的 SP 不只是「跑得通」,更要「跑得快、改得動、查得著」。**規範先行、集合思維、索引匹配、TempDB 節制、實測決策**——將這五大原則內化為團隊肌肉記憶,SP 層將成為系統最穩健、最高效的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
操作建議原因
大量資料建暫存表`SELECT INTO #tmp` 避免記錄、極快最小記錄、無系統表爭用
小量資料/重複使用`CREATE TABLE #tmp ...; INSERT ...`緩和系統表壓力、可建索引
暫存表需索引建表、建索引放**獨立子 SP**確保編譯計畫能使用索引統計
結束時清理`TRUNCATE TABLE #tmp; DROP TABLE #tmp`避免系統表長時間鎖定
減少 DISTINCT/ORDER BY/GROUP BY能在應用層/索引解決盡量不在 TempDB 排序降低 TempDB 負載、避免溢寫磁碟