一、MSSQL架构概览
MSSQL是Microsoft SQL Server的缩写,是由微软公司开发的关系型数据库管理系统。MSSQL的架构可以分为四个层次:基础结构层,存储层,查询处理层以及服务层。
基础结构层: 基础结构层是MSSQL的最底层,主要包括操作系统和文件系统两部分。
存储层: 存储层是MSSQL的核心层,主要包括数据文件、事务日志文件以及备份文件三部分。MSSQL使用基于页的机制来管理磁盘空间,在数据文件中,MSSQL将数据按照页的形式进行存储,而在事务日志文件中,则是将日志记录按照事务的形式进行存储。
查询处理层: 查询处理层是MSSQL的核心层之一,主要包括查询解析器、查询优化器以及查询执行器三部分。
服务层: 服务层是MSSQL的最顶层,主要包括数据访问服务、存储引擎以及SQL Server Agent三部分。
二、存储层详解
1. 数据文件
数据文件是MSSQL中存储数据的主要文件类型,它们存储了表中的所有行和页。MSSQL中的每个数据库都有一个或多个数据文件,这些文件可以在单个磁盘上或分布在多个磁盘上存储。
重要概念: MSSQL中的数据文件是由一个个页组成的,每个页默认大小为8KB。
USE master;
GO
CREATE DATABASE TestDB
ON
( NAME = TestDB_data, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.mdf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 10MB );
GO
上述代码创建了一个名为TestDB的数据库,并将其存储在' C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.mdf'文件中,文件大小为10MB,最大文件大小为50MB,每次增长10MB。
2. 事务日志文件
事务日志文件记录了数据库中每个事务的修改操作,包括INSERT、UPDATE和DELETE操作。它是恢复数据的重要基础。在MSSQL中,每个数据库都有一个事务日志文件。
重要概念: MSSQL中的事务日志文件是由逻辑日志文件组成的,每个逻辑日志文件默认大小为1MB。
USE master;
GO
CREATE DATABASE TestDB
ON
( NAME = TestDB_data, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB.mdf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 10MB ),
( NAME = TestDB_log, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\TestDB_log.ldf', SIZE = 2MB, MAXSIZE = 50MB, FILEGROWTH = 1MB );
GO
上述代码创建了一个名为TestDB的数据库,并将其数据存储在TestDB.mdf文件中,将其事务日志存储在TestDB_log.ldf文件中,文件初始大小为2MB,最大文件大小为50MB,每次增长1MB。
三、查询处理层详解
1. 查询解析器
查询解析器的主要作用是将Transact-SQL代码转换为内部数据结构,即解析一个SQL语句,生成语法树,该语法树由一系列的OPS树节点组成,每个OPS节点实现一个SQL语句的一部分逻辑。
重要概念: Transact-SQL是MSSQL中的编程语言,可用于管理数据库对象和执行查询。
USE TestDB;
GO
SELECT *
FROM Person.Address
WHERE City = 'Seattle';
GO
上述代码是一个简单的Transact-SQL查询,查询了在地址表中居住在西雅图的人。查询处理器将该查询解析为一系列的OPS树节点,以便进一步优化和执行。
2. 查询优化器
查询优化器的主要作用是从生成的语法树中选择最优的执行计划。在生成语法树后,查询优化器将尝试构建多个执行计划,并根据代价模型选择最佳执行计划。
重要概念: 执行计划是MSSQL中生成的在执行查询时使用的一种规划。
USE TestDB;
GO
SELECT a.BusinessEntityID, b.AddressLine1, c.Name
FROM Person.Person a
JOIN Person.Address b
ON a.BusinessEntityID = b.BusinessEntityID
JOIN Person.StateProvince c
ON b.StateProvinceID = c.StateProvinceID
WHERE c.CountryRegionCode = 'US';
GO
上述代码是一个三表查询,查询了位于美国州的所有人。查询优化器将生成多个执行计划,其中会选择一个最优的执行计划,并根据该执行计划执行查询。
3. 查询执行器
查询执行器的主要作用是执行查询时生成的执行计划,并返回结果。
重要概念: 执行计划是在查询优化器中生成的一种规划,描述了执行查询所需的操作。
USE TestDB;
GO
SELECT COUNT(*)
FROM Person.Person;
GO
上述代码是一个简单的计算表中行数的查询。查询执行器将生成一个执行计划,并从表中获取行数返回。
四、服务层详解
1. 数据访问服务
数据访问服务允许客户端应用程序和MSSQL之间进行通信,并允许从客户端发送的请求访问MSSQL中的数据。MSSQL支持多种数据访问服务,包括ADO.NET、ODBC和OLE DB。
重要概念: ADO.NET、ODBC和OLE DB是数据访问服务的三种主要方式。
using System.Data.SqlClient;
var connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password = myPassword;";
var connection = new SqlConnection(connectionString);
var command = new SqlCommand("SELECT * FROM Person.Person", connection);
connection.Open();
var dataReader = command.ExecuteReader();
while (dataReader.Read())
{
Console.WriteLine($"{dataReader.GetInt32(0)} {dataReader.GetString(1)}");
}
上述代码创建了一个数据库连接,并通过该连接执行一个简单的SELECT查询,将查询结果打印到控制台。
2. 存储引擎
存储引擎是MSSQL的核心组件之一,主要负责管理数据的存储、检索和维护。存储引擎实现了ACID属性,即原子性、一致性、隔离性和持久性,保证了数据的完整性和可靠性。
重要概念: ACID属性是关系型数据库中的一种事务处理标准,确保事务得到安全处理。
3. SQL Server Agent
SQL Server Agent是MSSQL的内部调度程序,它负责管理和自动化MSSQL中的各种任务和事件。通过SQL Server Agent,管理员可以创建各种作业、警报、计划和通知,以确保MSSQL数据库的安全性、稳定性和可靠性。
重要概念: SQL Server Agent负责管理和自动化MSSQL中的各种任务和事件,进行数据库维护的重要组件。
USE master;
GO
EXEC sp_add_job
@job_name = N'TestJob',
@enabled = 1,
@description = N'My test job';
GO
上述代码创建了一个名为TestJob的新作业,并启用了作业。
五、总结
本文介绍了MSSQL的架构和核心组件。MSSQL的架构包括基础结构层、存储层、查询处理层和服务层。其中,存储层是MSSQL的核心层,主要包括数据文件、事务日志文件以及备份文件三部分;查询处理层是MSSQL的核心组件之一,主要由查询解析器、查询优化器和查询执行器组成;服务层包括数据访问服务、存储引擎和SQL Server Agent。MSSQL的存储引擎是一款实现了ACID属性的高可靠性、高性能的数据库存储和管理引擎,为业务系统提供了稳定的数据处理能力。