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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…