SQL Server核心架構深度解析

SQL Server 的體系結構是一個復雜但設計精密的系統,主要可以分為四大核心組件,它們協同工作以管理數據庫、處理查詢、確保數據安全與一致性。以下是其體系結構的核心組成部分:

核心組件:

  1. 協議層 (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)。
  2. 關系引擎 (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): 管理與存儲過程、函數、觸發器等執行計劃相關的緩存和重用。
  3. 存儲引擎 (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
      • 文件管理器 (File Manager): 管理數據庫文件(.mdf 主數據文件、.ndf 次要數據文件、.ldf 事務日志文件)在磁盤上的物理布局、增長、收縮等操作。與 Windows 文件系統交互。
      • 內存中的數據結構 (In-Memory Structures): 除 Buffer Pool 外,還包括計劃緩存 (Plan Cache)、數據緩存 (Data Cache - Buffer Pool 的一部分)、過程緩存 (Procedure Cache - 存儲執行計劃) 等。
  4. 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 的實現,優化磁盤訪問性能。

數據存儲核心概念:

  • 頁 (Page): 最基本的存儲單元,大小為 8KB。所有數據庫操作最終都發生在頁級別(讀取或寫入整個頁)。常見的頁類型有:數據頁、索引頁、文本/圖像頁、全局分配映射 (GAM) / 共享全局分配映射 (SGAM) 頁、索引分配映射 (IAM) 頁、頁可用空間 (PFS) 頁等。
  • 區 (Extent): 空間分配的基本單元,由 8 個連續的頁(64KB)組成。有兩種類型:
    • 統一區 (Uniform Extent): 所有 8 個頁都分配給同一個對象(如表或索引)。
    • 混合區 (Mixed Extent): 頁可以分配給最多 8 個不同的對象。主要用于小對象初始分配。
  • 文件和文件組 (Files & Filegroups):
    • 數據庫文件 (.mdf/.ndf): 物理存儲數據的操作系統文件。
    • 文件組 (Filegroup): 邏輯容器,用于組織和放置數據庫文件。可以包含一個或多個文件。對象(表、索引)是創建在文件組上的。PRIMARY 是默認文件組。通過文件組可以實現數據的分區管理、備份恢復策略和性能優化(將對象放置在不同物理磁盤的文件組上)。

關鍵交互流程示例 (SELECT 語句):

  1. 客戶端通過網絡發送 SQL SELECT 語句(封裝在 TDS 包中)。
  2. 協議層 接收并解包,將命令文本傳遞給 關系引擎
  3. 命令解析器 檢查語法,生成查詢樹。
  4. 查詢優化器 分析查詢樹,利用統計信息等生成成本估算,選擇最優執行計劃(可能使用緩存計劃)。
  5. 查詢執行器 開始執行計劃。如果需要數據,它會向 存儲引擎(訪問方法) 發起請求。
  6. 訪問方法 確定需要哪些數據頁。它請求 緩沖管理器 提供這些頁。
  7. 緩沖管理器 檢查所需頁是否在 緩沖池 (Buffer Pool) 中:
    • 若在(緩存命中),直接返回內存中的頁副本。
    • 若不在(緩存未命中),則從磁盤(數據文件)讀取該頁到 Buffer Pool,然后返回該頁。
  8. 訪問方法 處理頁中的數據(如讀取行)。
  9. 查詢執行器 處理結果(如過濾、排序、聚合),形成最終結果集。
  10. 最終結果集返回給 協議層
  11. 協議層 將結果集打包成 TDS 包,通過網絡發送回客戶端。

總結:

SQL Server 的體系結構是一個高效協作的分層架構:

  • 協議層 處理網絡通信。
  • 關系引擎 負責“思考”:解析、優化、協調查詢執行(邏輯操作)。
  • 存儲引擎 負責“行動”:物理數據存儲、訪問、事務處理、緩存管理(物理操作)。
  • SQLOS 提供基礎服務(調度、內存、同步、I/O),作為引擎與 Windows OS 之間的抽象層。

理解這些組件及其交互對于數據庫管理(性能調優、故障排除、容量規劃)和應用程序開發(編寫高效 SQL)至關重要。核心設計圍繞著數據頁/緩沖池事務日志/WAL基于成本的優化器SQLOS調度這幾個支柱展開。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95605.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django REST Framework Serializer 進階教程

1. 序列化器概述 在 Django REST Framework(DRF)中,序列化器(Serializer)用于將復雜的數據類型(如模型實例)轉換為 JSON 格式,以便于 API 返回給客戶端。此外,序列化器還…

面試問題詳解十四:Qt 多線程同步【QSemaphore】講解

在多線程開發中,經常需要控制多個線程對共享資源的訪問數量。例如限制同時下載文件的數量、控制數據庫連接池的連接使用等等。這時候,Qt 提供的 QSemaphore(信號量)就非常派得上用場。一、什么是 QSemaphore? QSemapho…

Spark mapGroups 函數詳解與多種用法示例

mapGroups 是 Spark 中一個強大的分組操作函數,它允許你對每個分組應用自定義邏輯并返回一個結果。以下是多個使用簡單樣例數據的具體用法示例。基礎示例數據假設我們有一個簡單的學生成績數據集:// 創建示例DataFrame val studentScores Seq(("Ma…

【圖論】Graphs.jl 圖數據的讀寫與生成器

文章目錄圖數據的讀寫Graphs.loadgraphGraphs.loadgraphsGraphs.savegraph保存單個圖保存圖字典Graphs.loadlg_multGraphs.savelgGraphs.savelg_mult圖的生成器1. 隨機圖模型1.1 Erd?s–Rnyi 模型1.2 巴拉巴西-阿爾伯特模型 (無標度網絡)1.3 小世界網絡模型1.4 隨機塊模型 (SB…

Go指針全解析:從基礎到實戰

基本概念與定義指針的定義指針是一種特殊的變量類型,它存儲的不是實際數據值,而是另一個變量在計算機內存中的地址。在底層實現上,指針本質上是保存內存位置的無符號整數,它直接指向內存中的特定位置,允許程序直接操作…

Oracle 查詢有哪些用戶 提示用戶名密碼無效

要查詢 Oracle 數據庫中的所有用戶,可以使用以下 SQL 查詢語句。這個查詢將返回數據庫中所有用戶的列表。 [] SELECT username FROM all_users ORDER BY username;如果你有足夠的權限(通常是 DBA 權限),你也可以使用 dba_users 視…

小白成長之路-develops -jenkins部署lnmp平臺

文章目錄一、準備工作1.1兩臺虛擬機1.2配置文件1.3免密登錄二、實戰1.構建主item2.測試nginx,php,mysql2.1新建測試項目2.2與正式項目綁定構建后的操作2.3測試2.4導入discuz項目總結一、準備工作 1.1兩臺虛擬機 服務器:192.168.144.24 客戶端:192.168.…

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效 一、前言 最近在做 HarmonyOS 6.0 的適配,發現 Beta1版本里多了個很實用的視效功能——自帶背景的雙邊流光。 之前做屏幕邊緣流光特效的時候,要么得自己寫漸變動畫拼效果,要么就得套好幾個組件疊層&…

跟做springboot尚品甄選項目

springbootvue3 【尚硅谷Java項目《尚品甄選》 SpringBootSpringCloud萌新學會企業級java項目】003.后臺系統-搭建前端環境(工程創建)_嗶哩嗶哩_bilibili E:\project\AllProJect\Shangpin Selection\項目材料素材\課件\尚品甄選項目課件 前端套用框架…

【Linux】創建線程

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 文章目錄 一、為什么需要線程? 創建線程 示例:計算斐波恩夕法 一、為什么需要線程? 在多核處理器的計算機上,線程可…

HTML應用指南:利用POST請求獲取全國九號電動車體驗店服務店位置信息

九號公司(Ninebot)作為全球領先的智能短途出行解決方案提供商,始終秉持“智慧移動,愉悅生活”的品牌理念,致力于為個人用戶打造安全、智能、時尚的城市出行體驗。依托“智能硬件 + 數字服務 + 線下觸點”三位一體的戰略布局,九號公司已建立起覆蓋全國、輻射全球的銷售與服…

Kafka面試精講 Day 4:Consumer消費者模型與消費組

【Kafka面試精講 Day 4】Consumer消費者模型與消費組 在“Kafka面試精講”系列的第四天,我們將深入探討Kafka的核心組件之一——Consumer消費者模型與消費組(Consumer Group)。這是Kafka實現高吞吐、可擴展消息消費的關鍵機制,也…

使用 Uni-app 打包 外鏈地址APK 及 iOS 注意事項

本文詳細介紹了如何使用 Uni-app 框架將項目打包為 Android APK 和 iOS 應用,重點講解了 minSdkVersion、targetSdkVersion 和 abiFilters 的配置,以及 iOS 開發的注意事項。文章還包含了您提供的 WebView 示例代碼,并提供了關鍵的注意事項&a…

異常處理小妙招——3.構造函數的安全第一原則:為什么不在構造函數中拋出異常?

文章目錄災難性的生日派對構造函數:對象的出生證明安全第一:嚴格的出生檢查為什么要在構造函數中嚴格驗證?1. 避免"僵尸對象"2. Fail-Fast(快速失敗)原則現實世界的實踐建議1. 使用工廠方法模式2. 使用Build…

iptables 和 ip route

文章目錄iptables原理及常用命令表鏈鏈表鏈表總結iptables 常用命令及參數1. 規則管理命令 (Commands)2. 規則匹配參數 (Rule-Specification - Matches)3. 目標動作參數 (Target)命令示例配置流程示例ip route常用命令iptables和ip route的聯系實用命令示例對比iptables原理及常…

RPC和HTTP的區別?

RPC和HTTP是兩種不同的通信協議,它們在通信方式、性能效率以及靈活性可擴展性等方面存在區別。以下是具體分析: 通信方式 RPC:RPC是基于遠程過程調用的二進制協議,它允許客戶端像調用本地函數一樣調用遠程服務器上的函數或方法[2]…

貝葉斯分類(Bayes Classify)

一. 核心思想貝葉斯分類是一類基于貝葉斯定理(Bayes Theorem)和概率統計的分類算法,核心思想是 “通過已知的先驗概率,結合數據的似然性,計算后驗概率,最終將樣本歸為后驗概率最高的類別”。它在機器學習、…

怎么熟悉業務,我是做前端的,但對業務了解沒有渠道

作為前端開發者,想深入了解業務但“沒有渠道”,這是非常普遍的痛點。很多前端同學只接到“切圖實現頁面”的任務,久而久之就成了“實現工具人”。但業務理解力,恰恰是區分“初級”和“高級”前端的核心分水嶺。 好消息是&#xff…

如何批量在PDF文檔最后一頁蓋章?

在面對上百份需要處理的 PDF 文檔時,逐個打開文檔蓋章再進行保存,這些步驟不僅提高我們工作的繁瑣,還容易導致處理位置錯誤或遺漏。那么怎么去將 PDF 文檔末頁實現批量自動打上電子印章?一般的方式沒有辦法來滿足我們高效率辦公的…

Keras/TensorFlow 中 `predict()` 函數詳細說明

Keras/TensorFlow 中 predict() 函數詳細說明 predict() 是 Keras/TensorFlow 中用于模型推理的核心方法,用于對輸入數據生成預測輸出。下面我將從多個維度全面介紹這個函數的用法和細節。 一、基礎語法和參數 基本形式 predictions model.predict(x,batch_sizeNon…