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

資料庫調優筆記系列(三):游標優化與集合思維重構

     編輯:關於SqlServer

核心原則:能不用游標就不用

游標 = 逐列處理 = 慢、鎖久、記錄檔大、難並行。優先考慮集合式操作 (`INSERT...SELECT`、`MERGE`、`UPDATE...JOIN`、`CTE` 遞迴)。

若不得不用,三大優化方向

1. 邏輯整合:分流處理,大部份走集合式

分析業務分支,將「無資料需初始化」等大量同類情況提取出來,用單一 `INSERT...SELECT` 完成,僅剩少數複雜分支走游標。例:`IF NOT EXISTS` 批次初始化 → `INSERT INTO Target SELECT ... FROM Source WHERE NOT EXISTS ...`。

2. 業務導向優化:優化高頻路徑

80/20 法則:找出 80% 執行次數的路徑,針對該路徑極致優化 (集合化、索引覆蓋、減少往返)。低頻異常路徑保留游標邏輯即可。

3. 游標本身優化:選對類型、縮短交易

  • `DECLARE Cur CURSOR LOCAL FAST_FORWARD READ_ONLY`:唯讀、僅前進、本地、最輕量。
  • 避免 `STATIC`/`KEYSET`/`DYNAMIC` 除非必須感知並發變更。
  • 游標內**嚴禁**長時間運算/外部呼叫/等待,僅做必要 DML。
  • 大量資料考慮**分批提交** (每 N 列 Commit),配合冪等/補償設計。

實戰案例:待辦初始化

原邏輯:逐筆檢查 `tbTodo` 是否存在 → 不存在則 `INSERT`。
優化:統計目標範圍總數 → `IF COUNT=0` → 單一 `INSERT INTO tbTodo SELECT ... FROM Source` 一次性完成。
效果:從 O(N) 往返降為 O(1),鎖持有時間從秒級降至毫秒級。

總結

游標是「手術刀」,不是「菜刀」。集合思維是 SQL 開發者的核心內功。重構步驟:識別游標 → 分析業務分支 → 提取高頻集合化路徑 → 殘留低頻精簡游標 → 驗證效能與正確性。堅持這套流程,90% 以上游標可被消除或大幅優化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved