SQL Server 的體系結構是一個復雜但設計精密的系統,主要可以分為四大核心組件,它們協同工作以管理數據庫、處理查詢、確保數據安全與一致性。以下是其體系結構的核心組成部分:
核心組件:
-
協議層 (Protocol Layer)
- 作用: SQL Server 與外部世界(客戶端應用程序)的“大門”。
- 功能:
- 監聽客戶端連接請求。
- 解析網絡協議(如 TDS - Tabular Data Stream,這是 SQL Server 專用的協議,封裝在 TCP/IP、Named Pipes、Shared Memory 等之上)。
- 接收來自客戶端的 TDS 數據包(包含 SQL 語句、存儲過程調用等)。
- 將數據包解包,提取出其中的命令(Command),并將它們傳遞給下一層(關系引擎)。
- 接收關系引擎返回的結果集(Result Set)。
- 將結果集打包成 TDS 數據包。
- 將響應數據包發送回客戶端。
- 關鍵元素: 網絡庫 (Network Libraries/SQL Server Network Interface - SNI)。
-
關系引擎 (Relational Engine / Query Processor)
- 作用: SQL Server 的“大腦”,負責查詢的解析、優化和執行計劃的管理。它主要處理如何找到數據(邏輯操作)。
- 主要子組件:
- 命令解析器 (Command Parser): 接收來自協議層的命令(SQL 文本)。檢查語法和語義錯誤。生成初步的查詢樹 (Query Tree) 或代數樹 (Algebrized Tree),這是一種邏輯結構,表示查詢要執行的操作。
- 查詢優化器 (Query Optimizer): SQL Server 的核心智能組件。
- 接收命令解析器生成的查詢樹。
- 基于統計信息(數據分布、索引信息等)、系統負載、可用索引等因素,分析執行查詢的所有可能方式(生成多個候選執行計劃)。
- 估算每個候選計劃的執行成本(主要是 I/O 和 CPU 開銷)。
- 選擇它認為成本最低的執行計劃。這是一個基于成本的優化器 (CBO)。
- 輸出查詢執行計劃 (Query Execution Plan),這是一個詳細說明如何物理地執行查詢的藍圖(例如,使用哪個索引、使用哪種連接算法 - Hash Join, Merge Join, Nested Loops)。
- 查詢執行器 (Query Executor):
- 負責執行優化器生成的查詢執行計劃。
- 它本身不直接處理數據,而是作為協調者。
- 根據計劃,向下一層(存儲引擎)發起請求來獲取或修改數據。它會調用存儲引擎提供的訪問方法(Access Methods)接口。
- 處理執行過程中的數據流(如排序、聚合、連接操作)。
- 將最終的結果集返回給協議層。
- SQL 管理器 (SQL Manager): 管理與存儲過程、函數、觸發器等執行計劃相關的緩存和重用。
-
存儲引擎 (Storage Engine)
- 作用: SQL Server 的“肌肉”,負責管理如何物理地存儲數據(在磁盤和內存中)、訪問數據、維護數據完整性和事務處理。它專注于“數據在哪”和“如何讀寫”。
- 主要子組件:
- 訪問方法 (Access Methods):
- 存儲引擎與關系引擎(查詢執行器)交互的主要接口。
- 處理查詢執行器發出的數據操作請求(SELECT, INSERT, UPDATE, DELETE)。
- 決定是否需要從磁盤讀取數據頁(觸發 Buffer Manager)或是否可以直接操作內存中的數據。
- 管理對行、索引、分配單元等對象的掃描和查找操作。
- 處理鎖請求(調用鎖管理器)。
- 緩沖管理器 (Buffer Manager / Buffer Pool):
- 管理 SQL Server 最主要的內存區域:緩沖池 (Buffer Pool)。
- 核心職責是實現緩存機制:將數據庫的數據文件 (.mdf, .ndf) 中的數據頁 (Page)(8KB 的基本單位)讀入內存(緩沖池),以及將修改過的頁(臟頁 - Dirty Pages)寫回磁盤。
- 極大減少物理 I/O 操作,提升性能。
- 使用 LRU (Least Recently Used) 等算法管理內存中頁的生存周期。
- 包含
CHECKPOINT
進程,負責定期或在需要時將臟頁刷寫到磁盤(但不保證事務提交)。
- 事務管理器 (Transaction Manager):
- 確保數據庫的 ACID 屬性:
- 日志管理器 (Log Manager): 負責事務日志(.ldf 文件)的寫入。遵循 WAL (Write-Ahead Logging) 原則:在數據頁修改本身被寫入磁盤之前,必須先保證描述該修改的日志記錄被持久化寫入事務日志文件。這是保證原子性 (Atomicity) 和持久性 (Durability) 的核心機制。
- 鎖管理器 (Lock Manager): 管理并發控制,處理事務對數據資源(行、頁、表等)的加鎖和釋放鎖請求。確保事務的隔離性 (Isolation),防止臟讀、不可重復讀、幻讀等問題(具體隔離級別決定防止哪些問題)。
- 協調事務的 BEGIN TRAN, COMMIT TRAN, ROLLBACK TRAN。
- 確保數據庫的 ACID 屬性:
- 文件管理器 (File Manager): 管理數據庫文件(.mdf 主數據文件、.ndf 次要數據文件、.ldf 事務日志文件)在磁盤上的物理布局、增長、收縮等操作。與 Windows 文件系統交互。
- 內存中的數據結構 (In-Memory Structures): 除 Buffer Pool 外,還包括計劃緩存 (Plan Cache)、數據緩存 (Data Cache - Buffer Pool 的一部分)、過程緩存 (Procedure Cache - 存儲執行計劃) 等。
- 訪問方法 (Access Methods):
-
SQL Server 操作系統 (SQLOS)
- 作用: SQL Server 的“中樞神經系統和基礎平臺”,位于 Windows 操作系統之上,為其他引擎組件提供基礎服務。它抽象了底層操作系統,并針對數據庫工作負載進行了優化。
- 關鍵服務:
- 調度 (Scheduling): 管理 SQL Server 線程(或纖程)。使用非搶占式調度 (Non-Preemptive Scheduling),任務(如查詢執行)在主動讓出 CPU (
SOS_SCHEDULER_YIELD
) 或等待資源(I/O、鎖)時才會被切換。每個 CPU 核心通常對應一個調度器 (Scheduler),調度器管理 Worker Threads (工作線程) 來執行任務。 - 內存管理 (Memory Management): 整體管理 SQL Server 的內存使用(不只是 Buffer Pool),包括動態分配和回收,與 Windows 的 AWE (Address Windowing Extensions) 或 Lock Pages in Memory 權限交互。
- 資源監控 (Resource Monitoring): 監控 CPU、內存、I/O 等資源的使用情況。檢測死鎖(Deadlock Detection)。
- 異常處理 (Exception Handling): 處理 SQL Server 內部的錯誤和異常。
- 同步原語 (Synchronization Primitives): 提供鎖、閂鎖 (Latches - 保護內存中數據結構的短期輕量鎖)、自旋鎖 (Spinlocks) 等同步機制,協調多線程并發訪問內部數據結構。
- I/O 管理 (I/O Management): 異步 I/O 的實現,優化磁盤訪問性能。
- 調度 (Scheduling): 管理 SQL Server 線程(或纖程)。使用非搶占式調度 (Non-Preemptive Scheduling),任務(如查詢執行)在主動讓出 CPU (
數據存儲核心概念:
- 頁 (Page): 最基本的存儲單元,大小為 8KB。所有數據庫操作最終都發生在頁級別(讀取或寫入整個頁)。常見的頁類型有:數據頁、索引頁、文本/圖像頁、全局分配映射 (GAM) / 共享全局分配映射 (SGAM) 頁、索引分配映射 (IAM) 頁、頁可用空間 (PFS) 頁等。
- 區 (Extent): 空間分配的基本單元,由 8 個連續的頁(64KB)組成。有兩種類型:
- 統一區 (Uniform Extent): 所有 8 個頁都分配給同一個對象(如表或索引)。
- 混合區 (Mixed Extent): 頁可以分配給最多 8 個不同的對象。主要用于小對象初始分配。
- 文件和文件組 (Files & Filegroups):
- 數據庫文件 (.mdf/.ndf): 物理存儲數據的操作系統文件。
- 文件組 (Filegroup): 邏輯容器,用于組織和放置數據庫文件。可以包含一個或多個文件。對象(表、索引)是創建在文件組上的。
PRIMARY
是默認文件組。通過文件組可以實現數據的分區管理、備份恢復策略和性能優化(將對象放置在不同物理磁盤的文件組上)。
關鍵交互流程示例 (SELECT 語句):
- 客戶端通過網絡發送 SQL
SELECT
語句(封裝在 TDS 包中)。 - 協議層 接收并解包,將命令文本傳遞給 關系引擎。
- 命令解析器 檢查語法,生成查詢樹。
- 查詢優化器 分析查詢樹,利用統計信息等生成成本估算,選擇最優執行計劃(可能使用緩存計劃)。
- 查詢執行器 開始執行計劃。如果需要數據,它會向 存儲引擎(訪問方法) 發起請求。
- 訪問方法 確定需要哪些數據頁。它請求 緩沖管理器 提供這些頁。
- 緩沖管理器 檢查所需頁是否在 緩沖池 (Buffer Pool) 中:
- 若在(緩存命中),直接返回內存中的頁副本。
- 若不在(緩存未命中),則從磁盤(數據文件)讀取該頁到 Buffer Pool,然后返回該頁。
- 訪問方法 處理頁中的數據(如讀取行)。
- 查詢執行器 處理結果(如過濾、排序、聚合),形成最終結果集。
- 最終結果集返回給 協議層。
- 協議層 將結果集打包成 TDS 包,通過網絡發送回客戶端。
總結:
SQL Server 的體系結構是一個高效協作的分層架構:
- 協議層 處理網絡通信。
- 關系引擎 負責“思考”:解析、優化、協調查詢執行(邏輯操作)。
- 存儲引擎 負責“行動”:物理數據存儲、訪問、事務處理、緩存管理(物理操作)。
- SQLOS 提供基礎服務(調度、內存、同步、I/O),作為引擎與 Windows OS 之間的抽象層。
理解這些組件及其交互對于數據庫管理(性能調優、故障排除、容量規劃)和應用程序開發(編寫高效 SQL)至關重要。核心設計圍繞著數據頁/緩沖池、事務日志/WAL、基于成本的優化器和SQLOS調度這幾個支柱展開。