文档章节

sqlserver 体系结构

易野
 易野
发布于 2017/08/11 09:23
字数 2332
阅读 27
收藏 0

在了解 SQL Server 数据库时,可以先从数据库的体系结构来观察。SQL Server 的体系结构中包含 4 个主要组成部分:

协议层(Protocols)

当应用程序与 SQL Server 数据库通信时,首先需要通过 SNI(SQL Server Network Interface)网络接口选择建立通信连接的协议。可以使用以下协议:

  • TCP/IP:应用最广泛的协议;
  • Named Pipes:仅为局域网(LAN)提供服务;
  • Shared Memory:仅支持在同一台机器上;
  • VIA(Virtual Interface Adapter):仅支持高性能 VIA 硬件;(该协议已弃用)

可以对 SQL Server 进行配置,使其可以同时支持多种协议。各种协议在不同的环境中有着不同的性能表现,需要根据性能需求选择合适的协议。如果客户端并未指定使用哪种协议,则可配置逐个地尝试各种协议。

连接建立后,应用程序即可与数据库进行直接的通信。当应用程序准备使用 T-SQL 语句 "select * from TableA" 向数据库查询数据时,查询请求在应用程序侧首先被翻译成 微软定义的TDS 协议包(TDS:Tabular Data Stream 即表格格式数据流协议),然后通过连接的通信协议信道发送至数据库一端。

SQL Server 协议层接收到请求,并将请求转换成关系引擎(Relational Engine)可以处理的形式。

关系引擎(Relational Engine)

关系引擎(Relational Engine)也称为查询处理器(Query Processor),主要包含 3 个部分:

  • 命令解析器(Command Parser)
  • 查询优化器(Query Optimizer)
  • 查询执行器(Query Executor)

协议层将接收到的 TDS 消息解析回 T-SQL 语句,首先传递给命令解析器(Command Parser)。

命令解析器(Command Parser)检查 T-SQL 语法的正确性,并将 T-SQL 语句转换成可以进行操作的内部格式,即查询树(Query Tree)。

  • 查询树(Query Tree)是结构化查询语言 SQL(Structured Query Language)的内部表现形式。
  • 数据操纵语言 DML(Data Manipulation Language)是 SQL 语言的子集,包括 INSERT, UPDATE, DELETE 三种核心指令。
  • 数据定义语言 DDL(Data Definition Language)管理表和索引结构,包括 CREATE, DROP, ALTER, TRUNCATE 等命令。
  • 数据控制语言 DCL(Data Control Language)负责授权用户访问和处理数据,包括 GRANT, REVOKE 等命名。
  • T-SQL 即 Transact-SQL 则是在 SQL 基础上扩展了过程化编程语言的功能,如流程控制等。
  • SQLCLR(SQL Server Common Language Runtime)使用 .NET 程序集来扩展功能。

查询优化器(Query Optimizer)从命令解析器处得到查询树(Query Tree),判断查询树是否可被优化,然后将从许多可能的方式中确定一种最佳方式,对查询树进行优化。

  • 无法优化的语句,包括控制流和 DDL 等,将被编译成内部形式。
  • 可优化的语句,例如 DML 等,将被做上标记等待优化。

优化步骤首先进行规范查询(Normalize Query),可以将单个查询分解成多个细粒度的查询,并对细粒度的查询进行优化,这意味着它将为执行查询确定计划,所以查询优化器的结果是产生一个执行计划(Execution Plan)。

查询优化是基于成本的(Cost-based)考量的,也就是说,选择成本效益最高的计划。查询优化器需要根据内部记录的性能指标选择消耗最少的计划。这些内部性能指标包括:Memory 需求、CPU 利用率和 I/O 操作数量等。同时,查询优化还使用启发式算法(Pruning Heuristics),以确保评估优化及查询的时间消耗不会比直接执行未优化查询的时间更长。

在完成查询的规范化和最优化之后,这些过程产生的结果将被编译成执行计划(Execution Plan)数据结构。执行计划中包括查询哪张表、使用哪个索引、检查何种安全性以及哪些条件为何值等信息。

查询执行器(Query Executor)运行查询优化器(Query Optimizer)产生的执行计划,在执行计划中充当所有命令的调度程序,并跟踪每个命令执行的过程。大多数命令需要与存储引擎(Storage Engine)进行交互,以检索或修改数据等。

存储引擎(Storage Engine)

SQL Server 存储引擎中包含负责访问和管理数据的组件,主要包括:

  • 访问方法(Access Methods)
  • 锁管理器(Lock Manager)
  • 事务服务(Transaction Services)
  • 实用工具(Controlling Utilities)

访问方法(Access Methods)包含创建、更新和查询数据的具体操作,下面列出了一些访问方法类型:

  • 行和索引操作(Row and Index Operations):负责操作和维护磁盘上的数据结构,也就是数据行和 B 树索引。
  • 页分配操作(Page Allocation Operations):每个数据库都是 8KB 磁盘页的集合,这些磁盘页分布在多个物理文件中。SQL Server 使用 13 种磁盘页面结构,包括数据页面、索引页面等。
  • 版本操作(Versioning Operations):用于维护行变化的版本,以支持快照隔离(Snapshot Isolation)功能等。

访问方法并不直接检索页面,它向缓冲区管理器(Buffer Manager)发送请求,缓冲区管理器在其管理的缓存中扫描页面,或者将页面从磁盘读取到缓存中。在扫描启动时,会使用预测先行(Look-ahead Mechanism)机制对页面中的行或索引进行验证。

锁管理器(Lock Manager)用于控制表、页面、行和系统数据的锁定,负责在多用户环境下解决冲突问题,管理不同类型锁的兼容性,解决死锁问题,以及根据需要提升锁(Escalate Locks)的功能。

事务服务(Transaction Services)用于提供事务的 ACID 属性支持。ACID 属性包括:

  • 原子性(Atomicity)
  • 一致性(Consistency)
  • 隔离性(Isolation)
  • 持久性(Durability)

预写日志(Write-ahead Logging)功能确保在真正发生变化的数据页写入磁盘前,始终先在磁盘中写入日志记录,使得任务回滚成为可能。写入事务日志是同步的,即 SQL Server 必须等它完成。但写入数据页可以是异步的,所以可以在缓存中组织需要写入的数据页进行批量写入,以提高写入性能。

SQL Server 支持两种并发模型来保证事务的 ACID 属性:

  • 悲观并发(Pessimistic Concurrency)假设冲突始终会发生,通过锁定数据来确保正确性和并发性。
  • 乐观并发(Optimistic Concurrency)假设不会发生冲突,在碰到冲突再进行处理。

在乐观并发模型中,用户读数据时不锁定数据。在执行更新时,系统进行检查,查看另一个用户读过数据后是否更改了数据。如果另一个用户更改了数据,则产生一个错误,接收错误信息的用户将回滚事务。该模型主要用在数据争夺少的环境中,以及锁定数据的成本超过回滚事务的成本时。

SQL Server 提供了 5 中隔离级别(Isolation Level),在处理多用户并发时可以支持不同的并发模型。

  • Read Uncommitted:仅支持悲观并发;
  • Repeatable Read:仅支持悲观并发;
  • Serializable:仅支持悲观并发;
  • Snapshot: 支持乐观并发;
  • Read Committed:默认隔离级别,依据配置既可支持悲观并发也可支持乐观并发。

实用工具(Controlling Utilities)中包含用于控制存储引擎的工具,如批量加载(Bulk-load)、DBCC 命令、全文本索引管理(Full-text Index Management)、备份和还原命令等。

SQLOS

SQLOS 是一个单独的应用层,位于 SQL Server 引擎的最低层。SQLOS 的主要功能包括:

  • 调度(Scheduling)
  • 内存管理(Memory Management)
  • 同步(Synchronization):提供 Spinlock, Mutex, ReaderWriterLock 等锁机制。
  • 内存代理(Memory Broker):提供 Memory Distribution 而不是 Memory Allocation。
  • 错误处理(Exception Handling)
  • 死锁检测(Deadlock Detection)
  • 扩展事件(Extended Events)
  • 异步 I/O(Asynchronous IO)

数据库体系结构对比

实际上,如果从体系结构的整体上来比较,各种常见的关系型数据库的体系结构都是差不多的。这也使得我们在了解一种数据库后,可以大体的猜测和快速理解另一种数据库。

下面是 Oracle 数据库的架构图:

经典版的如下:

pg 数据库结构图

下面是 MySQL 数据库的结构图:

MySQL 数据库在存储引擎部分实现了可插拔式设计(Pluggable Storage Engines),可以根据需求不同选择不同类型的存储引擎实现。

 Feature 

 InnoDB 

 MyISAM 

 Memory 

 Storage Limits 

 64TB

 256TB

 RAM

Transactions

 Yes

 No

 No

 Locking Granularity 

 Row

 Table

 Table

B-Tree Indexes

 Yes

 Yes

 Yes

Compressed Data

 Yes  Yes  No

Encrypted Data

 Yes  Yes  Yes

 Full-Text Search Indexes 

 Yes  Yes  No

Foreign Key Support

 Yes  No  No

甚至在同一个数据库实例中,每张数据表都可以指定使用哪种存储引擎。

CREATE TABLE customers (a INT, b CHAR (20), INDEX (a)) ENGINE=InnoDB;

© 著作权归作者所有

共有 人打赏支持
易野
粉丝 4
博文 161
码字总数 121136
作品 0
深圳
SQL SERVER与mysql 的区别

2010-04-12 09:26:56| 分类: 寒窗磨剑|举报|字号 订阅 今天问了一下高手关于数据库的问题, 他的回答是,如果是做网站的话最好是用sqlserver,如果只是做企业内部的系统或者是单机的软件的话...

波利beryl
2014/11/10
0
0
SQLSERVER2005的混和身份验证模式的设置以及SA登陆问题

Question: 安装2005的时候,没有设置混合验证模式,只用了Window身份验证,现在要写数据库连接字符串,如果用window身份验证写比较麻烦,所以想到了怎样把SQL的登陆方式从Window改为SQLServ...

星辰~
2012/06/05
0
0
FreeBSD下执行SQL Server2005存储过程解决方案

FreeBSD下执行SQL Server2005存储过程解决方案(Warning: mssql_execute(): ...) FreeBSD下使用SQL Server2005(2008)需要使用FreeTDS。 安装FreeTSD后,使用PHP语言进行测试。在使用mssql_e...

雷xiao雨
2014/03/01
0
0
在Linux上使用mssql-conf工具配置SQL Server 2017

在Linux上使用mssql-conf工具配置SQL Server 2017 mssql-conf是在Linux上安装SQL Server 2017后的一个配置脚本。你可以使用这个实用工具设置以下参数: 使用贴士: l 对于AlwaysOn可用性组和...

UltraSQL
07/30
0
0
SQLServer 开启远程访问,也可逆向思维进行关闭

为了可以通过TCP/IP协议远程访问SQLServer数据库,需要做以下几点: 在SQLServer所运行的服务器上,我们必须找到SQLServer所侦听的端口然后添加到WIndows防火墙的【允许入站】中。 一:需要添...

easonjim
2015/08/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

sourcetree 离线免注册登录安装教程

Sourcetree是一个优秀的git可视化管理工具,深受开发者喜爱Sourcetree官网,但是在安装时需要谷歌账户登录,需要翻qiang才可以,此一点一直被人们所诟病。今天本教程就为大家提供离线免登陆安...

QQZZFT
14分钟前
1
0
使用 PostgreSQL 解决一个实际的统计分析问题

使用 PostgreSQL 解决一个实际的统计分析问题作者:老农民(刘启华)Email: 46715422@qq.com 之前有个朋友扔给我一个奇葩需求,他们公司之前做了一批问卷调查,全部都是统一格式的excel...

新疆老农民
17分钟前
1
0
TypeScript基础入门之高级类型的映射类型

转发 TypeScript基础入门之高级类型的映射类型 高级类型 映射类型 一个常见的任务是将一个已知的类型每个属性都变为可选的: interface PersonPartial {    name?: string;    age?...

durban
32分钟前
1
0
Dubbo源码分析(6):Dubbo内核实现之基于SPI思想Dubbo内核实现

SPI接口定义 定义了@SPI注解 package com.alibaba.dubbo.common.extension; import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.an......

郑加威
32分钟前
1
0
RxJS的另外四种实现方式(后记)—— 同时实现管道和链式编程

目录 RxJS的另外四种实现方式(序) RxJS的另外四种实现方式(一)——代码最小的库 RxJS的另外四种实现方式(二)——代码最小的库(续) RxJS的另外四种实现方式(三)——性能最高的库 Rx...

一个灰
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部