連線架構分層概覽
用戶端連線堆疊由上而下:
- API / 物件庫層:ODBC、DB-Library、OLE DB、ADO、ADO.NET
- Net-Library 層:通訊協定轉換器(TCP/IP、Named Pipes、Shared Memory、VIA 等)
- 通訊協定層:實體網路傳輸(TCP、SMB、InfiniBand 等)
- 伺服器端 UMS/SOS 排程器:連線指派、工作排程
第一層:資料存取 API 與物件庫
ODBC (Open Database Connectivity)
- C/C++ 原生 API,標準化函數呼叫(
SQLConnect、SQLExecDirect)
- SQL Server 內建工具(查詢分析器、Enterprise Manager)歷史採用 ODBC
OLE DB (Object Linking and Embedding Database)
- COM 元件架構,提供 Provider 概念(如
SQLOLEDB、SQLNCLI、MSOLEDBSQL)
- ADO 內部透過 OLE DB 與伺服器通訊
ADO (ActiveX Data Objects)
- Scripting/VB6/經典 ASP 常用,物件模型:
Connection、Command、Recordset
- 連接字串範例:
Provider=SQLOLEDB;Data Source=.;Initial Catalog=Northwind;UID=sa;PWD=****
ADO.NET (System.Data.SqlClient / Microsoft.Data.SqlClient)
- .NET Framework 原生提供者,SqlConnection、
SqlCommand、SqlDataReader、SqlDataAdapter
- Managed 程式碼直接呼叫 TDS 協定,效能優於 ADO/OLE DB
- 亦可透過
OleDbConnection (SQLOLEDB) 或 OdbcConnection 連線,但非首選
第二層:Client Net-Library (用戶端網路庫)
功能
在 API 與網路協定之間提供抽象通道,透明處理封包組裝/解裝、加密、重試邏輯。
支援協定與 DLL 對應 (SQL 2005/2008)
| 協定 | Net-Library DLL | 適用場景 |
| TCP/IP | dbnmpntw.dll (舊) / sqlncli.dll (新) | 跨網路、預設協定、防火牆友善 |
| Named Pipes | dbnmpntw.dll | 區域網、Windows 整合驗證、Kerberos 委派 |
| Shared Memory | dbmslpcn.dll | 本機連線、最高效能、繞過網路堆疊 |
| VIA (Virtual Interface Adapter) | viasso.dll | 高效能叢集、InfiniBand/iWARP 硬體 |
設定工具
- SQL Server 2000:用戶端網路公用程式 (cliconfg.exe)
- SQL Server 2005+:SQL Server Configuration Manager → 用戶端通訊協定
重點:共享記憶體 Net-Library
運作原理
- 用戶端與伺服器在同一實體機器
- 使用 Windows 記憶體對應檔 (Memory Mapped File) + 同步物件 (Mutex/Event)
- 繞過 TCP/IP 堆疊、網卡驅動、協定處理,延遲極低
啟用方式
- 連接字串指定
(local) 或 . 作為伺服器名稱
- 或明確加前綴
lpc:(如 lpc:MyServer\Instance)
效能與擴展性權衡
- 優點:延遲 ~10-50μs,吞吐量遠高於 TCP/IP 回環
- 缺點:連線綁定單一 UMS 排程器,高併發時可能造成單一 CPU 核心瓶頸
- 建議:本機高頻短連線(如網站連線池)優先 Shared Memory;長連線、高併發、跨 NUMA 節點考慮 TCP/IP 回環以分散排程器負載
連線指派與 UMS 排程器
- 啟動時,SQL Server 為每個邏輯 CPU 建立一個 UMS 排程器 (SQL 2005) / SOS 排程器 (2008+)
- 新連線指派給 目前連線數最少的排程器
- 連線存活期間不會切換排程器(親和性)
實務含義
應用程式開啟多條連線(如連線池 100 條),若工作負載不均勻(某幾條連線處理大部分請求),會導致對應排程器 CPU 飽和,而其他排程器閒置。解決方案:
- 調整連線池大小與工作分配邏輯
- 使用 Resource Governor 限制工作組 CPU
- 必要時重新連線以重新指派排程器(但無法指定目標排程器)