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

SQL Server 連線架構深度解析:從用戶端 API 到 TDS 協定

     編輯:關於SqlServer

前言

理解 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 EventT-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) 命令處理層。
  • 結果回傳沿原網路堆疊逆向傳輸至用戶端。

關鍵調優與疑難排解清單

  1. 同機器連線優先啟用 Shared Memory,但務必全面基準測試對比。
  2. 多連線應用確保工作負載均衡分散於各 UMS 排程器。
  3. 網路封包大小影響記憶體配置池,依應用類型調整。
  4. 優先使用 RPC / sp_executesql 促進計畫重用。
  5. 疑難排除:切換提供者 (SQLOLEDB ↔ ODBC OLE DB) 或 Net-Library (TCP/IP ↔ Named Pipes) 隔離問題層級。

總結

SQL Server 連線路徑雖多層,但在高效 Net-Library (特別是 Shared Memory) 下往返延遲極低。掌握 UMS 排程器親和性、封包大小記憶體模型、RPC 計畫重用機制,能從架構層面解決疑難效能問題。

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