SQL服务器 Archi结构 (已解释)

MS SQL Server 采用客户端-服务器架构。MS SQL Server 的工作流程始于客户端应用程序发送请求。SQL Server 接收、处理该请求,并返回处理后的数据。下面我们将详细讨论整个架构:
如下图所示,SQL Server 包含三个主要组件。 Archi結構:
- 协议层
- 关系引擎
- 储存引擎
协议层-SNI
SQL Server 协议层,也称为服务器网络接口 (SNI),支持三种类型的客户端-服务器架构。每种协议都适用于不同的网络场景。在了解查询的内部处理方式之前,理解这些协议至关重要。
共享内存
设想一下清晨的对话场景。汤姆和妈妈都在同一个地方——他们的家。汤姆要了杯咖啡,妈妈立刻递了过来。类似地,当客户端和服务器运行在同一台机器上时,SQL Server 也提供了共享内存协议。两者通过共享内存进行通信,无需任何网络开销。
比喻: Tom 对应客户端,Mom 对应 SQL Server,Home 对应机器,口头交流对应共享内存协议。
配置说明: In SQL管理Studio本地连接的“服务器名称”选项可以是“.”、“localhost”、“127.0.0.1”或“Machine\Instance”。
TCP / IP协议
现在假设汤姆想从10公里外的一家咖啡店买咖啡。汤姆在家,而咖啡店位于一个繁忙的集市里。他们通过蜂窝网络进行通信。同样,SQL Server 也提供了…… TCP / IP协议 当客户端和 SQL Server 位于通过网络连接的不同机器上时。
比喻: Tom 对应客户端,咖啡店对应 SQL Server,家庭和市场对应远程位置,蜂窝网络对应 TCP/IP 协议。
配置说明: 在 SQL Server Management Studio 中,TCP/IP 连接的“服务器名称”选项必须为“服务器的计算机\实例”。SQL Server 默认使用端口 1433 进行 TCP/IP 连接。
命名管道
最后,汤姆想从邻居塞拉那里要绿茶。他们身处同一地点,是邻居,并通过内部网络进行通信。类似地,当客户端和服务器通过局域网 (LAN) 连接时,SQL Server 也提供命名管道协议。
比喻: Tom 对应客户端,Sierra 对应 SQL Server,邻居对应局域网,内部网络对应命名管道协议。
配置说明: 命名管道默认处于禁用状态,必须通过 SQL 配置管理器启用。
什么是TDS?
现在我们已经了解了三种客户端-服务器架构类型,下面来看一下TDS:
- TDS 代表表格数据流。
- 这三种协议都使用TDS数据包。
- TDS被封装在网络数据包中,从而实现从客户端机器到服务器机器的数据传输。
- TDS 最初由 Sybase 开发,现在归 Sybase 所有。 Microsoft.
下表比较了三种 SQL Server 连接协议:
| 特性 | 共享内存 | TCP / IP协议 | 命名管道 |
|---|---|---|---|
| 网络范围 | 同一台机器 | 远程(广域网/互联网) | 仅局域网 |
| 默认端口 | 无 | 1433 | 445 |
| 性能 | 最快(无网络开销) | 良好(针对广域网优化) | 良好(针对局域网优化) |
| 默认启用 | 是 | 是 | 没有 |
| 最佳用例 | 本地开发和测试 | 生产远程访问 | 可信局域网环境 |
协议层负责处理网络通信,SQL Server架构的下一步就是处理查询本身。这时关系引擎就发挥作用了。
关系引擎
关系引擎也称为查询处理器。它包含 SQL Server 组件,这些组件决定查询需要执行什么操作以及如何以最高效的方式执行查询。它负责通过从存储引擎请求数据并处理返回的结果来执行用户查询。
如图所示,关系引擎由三个主要组件构成:
CMD解析器
从协议层接收的数据被传递给关系引擎。CMD 解析器是第一个接收查询数据的组件。它的主要任务是检查查询的语法和语义错误,然后生成查询树。
语法检查: 与其他编程语言一样,SQL Server 也预定义了一组关键字和语法规则。SELECT、INSERT、UPDATE 等语句都属于预定义关键字列表。CMD 解析器会验证输入是否符合这些规则。如果用户的输入偏离了预期的语法,解析器将返回错误。
计费示例: 想象一下,一个俄罗斯人走进一家日本餐厅,用俄语点餐。服务员只会日语,无法处理订单。同样地,如果用户输入“SELECR”而不是“SELECT”,CMD 解析器会返回错误,因为它无法识别该关键字。
语义检查: 这项工作由规范化器 (Normalizer) 执行。它会检查被查询的列名、表名和其他对象是否实际存在于模式中。如果存在,规范化器会将它们绑定到查询。此过程也称为绑定。当用户查询包含视图 (VIEW) 时,规范化器会将其替换为内部存储的视图定义。
计费示例: 运行 SELECT * from USER_ID 如果数据库中不存在表 USER_ID,则解析器会在语义检查期间抛出错误。
创建查询树: 此步骤会生成不同的执行树,分别代表查询的各种运行方式。所有树都会产生相同的预期输出。
优化
优化器会为用户的查询创建执行计划。该计划决定了查询的执行方式。并非所有查询都会被优化。优化适用于数据修改语言 (DML) 命令,例如 SELECT、INSERT、DELETE 和 UPDATE。数据定义语言 (DDL) 命令,例如 CREATE 和 ALTER,不会被优化,而是会被编译成内部形式。
查询成本是根据 CPU 使用率、内存使用率以及输入/输出需求等因素计算的。优化器的作用是找到性价比最高的执行方案,而不是绝对最优的方案。
计费示例: 假设你想开一个网上银行账户。一家银行最多需要两天时间。你还有另外 20 家银行的列表,它们可能需要更短的时间,也可能不需要。搜索所有 20 家银行未必能找到更快的方案,而且搜索本身也耗时。还不如直接选择第一家银行。类似地,SQL 优化器使用穷举算法和启发式算法来最大限度地缩短查询运行时间。
优化器分三个阶段进行搜索:
第0阶段:寻找琐碎计划
这是预优化阶段。对于某些查询,只存在一个可行的执行计划,称为平凡计划。无需进一步搜索,因为任何额外的搜索都会找到相同的执行计划,而且会增加额外的成本。
第一阶段:寻找交易处理方案
这包括搜索简单计划和复杂计划。简单计划搜索使用列和索引数据的统计分析,通常每个表只使用一个索引。如果找不到简单计划,则会执行更复杂的搜索,其中每个表使用多个索引。
第二阶段:并行处理和优化
如果之前的策略未能生成合适的方案,优化器会根据机器的处理能力寻找并行处理的可能性。如果并行处理不可行,则会进入最终优化阶段,利用所有剩余选项来寻找最佳执行方案。
查询执行器
查询执行器调用存储引擎中的访问方法。它提供一个包含执行所需数据获取逻辑的执行计划。一旦从存储引擎接收到数据,结果就会发布到协议层并发送给最终用户。
关系引擎确定查询执行方式后,存储引擎负责处理物理数据操作。这一层管理数据的存储、缓存和从磁盘检索的方式。
储存引擎
存储引擎负责将数据存储在磁盘或SAN等存储系统中,并在需要时检索数据。在了解存储引擎组件之前,首先需要了解数据的物理存储方式。
数据文件和范围
数据文件以数据页的形式物理存储数据,每个数据页的大小为 8KB。这是最小的存储单元。 SQL服务器数据页在逻辑上被分组为区段。任何对象都不直接被分配到单独的页面;维护是通过区段进行的。每个页面都有一个页面头(96 字节),其中包含页面类型、页码、已用空间、可用空间以及指向下一页和上一页的指针等元数据。
文件类型
主文件: 每个数据库都包含一个主文件。它存储与表、视图、触发器和其他对象相关的所有重要数据。文件扩展名通常是 .mdf,但也可以是任何其他扩展名。
次要文件: 数据库可能包含也可能不包含多个辅助文件。这些辅助文件是可选的,用于存储用户特定数据。文件扩展名通常为 .ndf,但也可以是任何其他扩展名。
日志档案: 也称为预写式日志。文件扩展名为 .ldf。日志文件用于事务管理、从异常实例中恢复以及回滚未提交的事务。
存储引擎由三个主要组件构成。每个组件在管理数据访问和完整性方面都发挥着特定的作用。
访问方式
访问方法充当查询执行器和……之间的接口 Buffer 管理器或事务日志。它本身不执行任何操作,而是确定查询类型:
- 如果查询是 SELECT 语句(DML)它被传递给 Buffer 经理将进行后续处理。
- 如果查询是 非 SELECT 语句(DDL 和 DML)它会被传递给事务管理器。这主要包括 UPDATE、INSERT 和 DELETE 语句。
Buffer 经理
此 Buffer 管理器管理计划缓存、数据解析和脏页处理的核心功能。
计划缓存
现有查询计划: 此 Buffer 管理器会检查执行计划是否存在于已存储的计划缓存中。如果存在,则直接使用缓存的查询计划及其关联的数据缓存。
首次缓存计划: 如果首次执行的查询计划很复杂,则会将其存储在计划缓存中。这样可以确保 SQL Server 下次收到相同查询时能够更快地响应。
数据解析: Buffer 缓存和数据存储
此 Buffer 管理器提供对所需数据的访问权限。根据缓存中是否存在数据,有两种可能的方法:
Buffer 缓存 – 软解析
此 Buffer 经理在以下位置查找数据 Buffer 缓存。如果数据存在,查询执行器将直接使用它。这可以提高性能,因为与从磁盘存储中获取数据相比,从缓存中获取数据所需的 I/O 操作更少。
数据存储——硬解析
如果数据不存在 Buffer 缓存是指在磁盘数据存储中搜索所需数据。然后,数据也会存储在数据缓存中以供将来使用。
交易经理
当访问方法确定查询不是 SELECT 语句时,将调用事务管理器。它通过以下几个子组件确保数据的一致性和持久性:
日志管理器
日志管理器通过存储在事务日志中的日志来跟踪系统中执行的所有更新。每条日志条目都包含一个日志序列号、事务 ID 和数据修改记录。此机制用于跟踪已提交和已回滚的事务。
锁管理器
在事务处理过程中,存储中的相关数据会进入锁定状态。锁管理器负责处理此过程,确保数据一致性和隔离性。这些特性也称为 ACID(ACID 特性)。Atom性、一致性、隔离性、持久性)。
执行流程
执行过程遵循以下步骤:
- 日志管理器开始记录日志,锁定管理器锁定相关数据。
- 数据副本保存在…… Buffer 缓存。
- 待更新数据的副本保存在日志中。 Buffer所有事件都会更新数据。 Buffer.
- 存储已修改数据的页面被称为 脏页.
检查点和预写式日志
检查点进程大约每分钟运行一次,并将所有脏页标记为要写入磁盘。但是,页面首先会被推送到日志文件的数据页。 Buffer 日志记录。这种机制称为预写式日志记录(Write-Ahead Logging)。即使脏页已写入磁盘,它们仍然保留在缓存中。
懒惰的作家
当 SQL Server 检测到高负载且需要缓冲内存来处理新事务时,它会从缓存中释放脏页。延迟写入器采用 LRU(最近最少使用)算法将页面从缓冲池清除到磁盘。
SQL Server 如何端到端处理查询
单独理解每一层固然重要,但了解它们如何协同工作才能看清全貌。当客户端应用程序发送 SQL 查询时,会发生以下一系列操作:
此 协议层 它通过共享内存、TCP/IP 或命名管道接收请求,并将其封装在 TDS 数据包中。 关系引擎 然后接管:CMD 解析器检查语法和语义,优化器生成最便宜的执行计划,查询执行器开始数据检索。
查询执行器调用 存储引擎的 访问方法,将 SELECT 查询路由到 Buffer 事务管理器的管理和修改查询。 Buffer 经理检查计划缓存和 Buffer 首先进行缓存(软解析)。如果数据未被缓存,则执行磁盘读取(硬解析)。对于写入操作,事务管理器会协调日志管理器、锁管理器和检查点进程,以确保符合 ACID 规范。
存储引擎返回请求的数据后,关系引擎格式化结果集,协议层通过相同的 TDS 协议将其传递回客户端应用程序。
如何为 SQL Server 连接选择正确的协议
选择正确的协议取决于客户端和服务器之间的物理关系以及性能要求。
使用共享内存 当客户端应用程序与 SQL Server 运行在同一台机器上时,这是最快的选择,因为它消除了所有网络开销。它非常适合本地开发、测试和单机部署。
使用 TCP/IP 当客户端和服务器位于通过广域网或互联网连接的不同机器上时,这是生产环境中最常用的协议。SQL Server 默认监听 1433 端口,并且该协议支持通过 TLS 进行加密连接。
使用命名管道 当客户端和服务器位于同一可信局域网 (LAN) 中,且内部网络性能至关重要时,命名管道 (Named Pipes) 默认处于禁用状态,必须通过 SQL Server 配置管理器启用。虽然在现代部署中已不常见,但对于传统的内网应用程序仍然非常有用。
















