前言
理解 SQL Server 連線架構對效能調校、問題診斷與安全性強化至關重要。本文自用戶端 API 層起,逐層剖析至網路協定、TDS 封包、伺服器端排程器 (UMS) 指派、記憶體配置、事件類型與最佳化建議。
用戶端存取層:API 與物件庫
- ODBC / DB-Library: 傳統 C/C++ API,查詢分析器、企業管理員仍採用。
- OLE DB (SQLOLEDB): COM 元件實作,MDAC 內建,ADO 底層即透過此提供者與 SQL Server 溝通。
- ADO / ADO.NET: 現代應用主流。ADO.NET 使用
SqlConnection、SqlCommand、SqlDataReader、SqlDataAdapter 直接以 Managed Code 與 SQL Server 交互,效能最佳。
ADO.NET 亦可透過 OleDbConnection (SQLOLEDB) 或 OdbcConnection 連線,故障排除時可切換提供者縮小問題範圍。
Net-Library:用戶端網路庫
在 API 與網路協定間提供通道,透明轉發請求/回應。支援 TCP/IP、Named Pipes、NWLink、Multiprotocol (RPC)、Shared Memory 等。
Shared Memory Net-Library(共享記憶體)
- 僅限用戶端與伺服器同機器。
- 繞過實體網路堆疊,透過 Windows 同步物件保護共享記憶體區域,延遲極低,吞吐量最高。
- 連接字串指定 `(local)` 或 `lpc:` 啟用。
- 注意:高併發下可能受限於核心物件排程與記憶體複製效能,擴展性需實測驗證。
連線指派與 UMS 排程器
- 啟動時每 CPU 建立一個 UMS 排程器。
- 新連線指派給當前連線數最少的排程器,連線期間固定隸屬,不會切換。
- 啟示: 多連線應用若工作負載不均(如連線 1、3 集中在 CPU 0),會造成 CPU 爭用。解決:重新連線期望分散至不同 CPU,或在應用層均衡分派工作。
連線記憶體配置
- 每連線保留 3 個網路封包緩衝區。
- 預設封包大小 < 8 KB → 緩衝池配置;≥ 8 KB → MemToLeave 區域配置。
- .NET Provider 預設 8 KB → MemToLeave;ADO 預設 4 KB → 緩衝池。擴展性規劃時須納入考量。
事件類型:語言事件 vs RPC
| 類型 | 說明 | 範例 |
| Language Event | T-SQL 批次傳送 | ADO `CommandType=adCmdText`、`adCmdTable` |
| RPC (Remote Procedure Call) | 參數化預存程序呼叫 | ADO `CommandType=adCmdStoredProc` |
為何偏好 RPC?
- 顯式參數化 → 執行計畫重用,避免重複編譯浪費 CPU 與記憶體。
- 語言事件依賴自動參數化,能力有限,易產生多餘計畫。
動態 T-SQL 情境:sp_executesql 參數化優於 EXEC() 串接字串,同樣促進計畫重用。
TDS (Tabular Data Stream) 協定
- 用戶端/伺服器間專屬資料格式,所有請求/回應皆封裝於 TDS 封包。
- 支援 TDS 8.0 (SQL 2000)、7.0 (SQL 7.0)、4.2 (SQL 6.5/6.0/4.2),唯 TDS 8.0 完整支援 SQL 2000 功能。
伺服器端接收與回應
- 每個監聽協定對應一個執行緒,使用 I/O Completion Port 高效處理。
- Net-Library 將 TDS 封包重組為原始請求,交給 Open Data Services (ODS) 命令處理層。
- 結果回傳沿原網路堆疊逆向傳輸至用戶端。
關鍵調優與疑難排解清單
- 同機器連線優先啟用 Shared Memory,但務必全面基準測試對比。
- 多連線應用確保工作負載均衡分散於各 UMS 排程器。
- 網路封包大小影響記憶體配置池,依應用類型調整。
- 優先使用 RPC /
sp_executesql 促進計畫重用。
- 疑難排除:切換提供者 (SQLOLEDB ↔ ODBC OLE DB) 或 Net-Library (TCP/IP ↔ Named Pipes) 隔離問題層級。
總結
SQL Server 連線路徑雖多層,但在高效 Net-Library (特別是 Shared Memory) 下往返延遲極低。掌握 UMS 排程器親和性、封包大小記憶體模型、RPC 計畫重用機制,能從架構層面解決疑難效能問題。