当前位置: 首页 > 科技观察

浅谈SQLServer内部运行机制

时间:2023-03-19 15:18:42 科技观察

对于已经熟悉T-SQL的读者,或者更专业的DBA来说,逻辑增删改查,或者更复杂的SQL语句,都非常简单,做不存在任何挑战都不值一提,那么SQL在哪些方面是他们的挑战或弱点呢?那就是sql优化。然而,要想成为一名优秀的Sql优化高手,首先要做的无疑是了解SQLServer中sql语句是如何执行的。本系列开始讲解sqlserver优化系列。本讲是优化系列的开篇。在本文中,我们将重点讲解SQLServer体系结构。在正式讲解之前,我们先来看看下面几个问题。你遇到过他们吗?如果你遇到过并且成功解决了,可以跳过这篇文章。为了测试,我们先模拟插入5.3亿多条数据。SELECTCOUNT(1)FROMBigDataTest(1)查询慢问题*,临时表,表连接,子查询等等,你能解决查询慢的问题吗?(2)内存泄漏:如下查询8分2秒,然后内存溢出,你知道这个问题吗?SELECT*FROMBigDataTest(3)经常听到下面的概念,你能解决吗?事务与锁(请参考我的另一篇文章:浅谈SQLServer事务与锁(上)https://www.cnblogs.com/wangjiming/p/8396986.html,ACID,隔离级别,脏读,子-表分库、水平拆分、垂直拆分、高并发等1.SQLServer架构抽象2.SQLServer系统结构概述SQLServer的核心架构大致包括六个部分:客户端访问工具、SQLServer网络接口(SQLServerNetworkInterface,SNI),关系引擎,存储引擎,磁盘和缓冲池。下图为SQLServer核心系统概略图。(1)SQLServer客户端访问工具SQLServer客户端访问工具提供远程访问技术,它基于与SQLServer服务器的某种协议,使其能够远程访问数据库,就像在本地操作数据库一样,就像我们经常使用MicrosoftSQLServerManagementStudio一样。SQLServer客户端访问工具有很多,比较流行的有MicrosoftSQLServerManagementStudio和Navicat(Navicat在MySQL中也很常用)。至于其他的工具,本文就不一一列举了。有兴趣的读者朋友,可以看看。(2)SQLServer网络协议SQLServer网络协议,也称为SQLServer网络接口(SNI),是构成客户端和服务器之间通信的桥梁,它可以基于一定的方式与SQLServer服务器进行通信协议,因为我们在客户端输入查询语句SELECT*FROMBigDataTest。该语句只能由服务器端根据客户端和服务器端之间的某种约定来解析。否则,它被认为是一个无效的声明。SQLServer网络协议由一组API组成,由SQLServer数据库引擎和SQLServer本地客户端调用,比如实现最基本的CRUD通信。SQLServer网络接口(SQLServerNetworkInterface,SNI)只需要在客户端和服务器端配置网络协议即可。它支持以下协议:(1)共享内存(2)TCP/IP(3)命名管道(4)VIA(3)关系引擎关系引擎,也叫查询引擎,它的主要功能是处理SQL语句,它的核心组件由三部分组成:命令分析器、查询优化器和查询执行器。(1)命令分析器:负责解析客户端传过来的T-SQL语句,比如客户端传过来一条SQL语句:SELECT*FROMBigDataTest,它会检查语句的语法结构,如果语法错误,则将错误返回给协议层,然后协议层将错误返回给客户端;如果语法结构正确,就会根据查询命令生成一个查询计划或者寻找一个已经存在的查询计划(先在bufferpoolplancache中查找,如果找到,则直接执行给查询执行器,如果没有找到,会生成一个基于T-SQL的查询树,然后交给查询优化器进行优化)(2)查询优化器:负责优化命令解析器生成的T-SQL查询树(基于资源优化,不是基于时间的优化),然后将最终的优化结果传递给查询执行器执行。查询优化器是一种基于“资源开销”的优化器。该算法对多种可执行的查询方法进行评估,选择代价最高的方案作为优化结果,然后根据结果生成查询计划输出给查询执行器。注意查询优化器是“基于资源成本***”而不是“基于计划***”,即查询优化器最终的优化结果不一定是最佳计划,但一定是资源成本***方案。(3)查询执行器:负责执行查询。如果查询执行器收到命令解析器或查询优化器传递过来的SQL语句:SELECT*FROMBigDataTest,通过OLEDB接口传递给存储引擎,再传递给存储引擎的访问方法。(4)存储引擎存储引擎的本质是管理资源存储。它的核心组件包括三个部分:访问方法、事务管理器和缓冲区管理器。(1)访问方法:访问方法本质上是查询执行器调用的接口(该接口提供了所有获取数据的代码,接口的实际执行由缓冲区管理器执行),如果查询执行器通过SQL语句:SELECT*FROMBigDataTest,access方法收到请求命令后,会调用buffermanager,buffermanager会调用bufferpool的plancache,在plancache中找到对应的结果集,并然后返回关系引擎。(2)Buffermanager:用于访问方法调用,管理缓冲池,在缓冲池中查询相应的资源并返回结果集,返回给访问方法的关系引擎。(3)事务管理器:主要负责事务管理(ACID管理)和高并发管理(锁),其中包括两个核心组件(日志管理器和锁管理器),锁管理器负责提供并发数据访问,设置隔离级别,ETC。;日志管理器负责记录所有访问方法的操作,例如基本的CRUD。(5)缓冲池缓冲池驻留在内存中,是磁盘和缓冲管理器之间的桥梁。在SQLServer中,所有的资源查询都是在内存中进行的,也就是在缓冲池中进行的。如果缓冲池接收到缓冲管理器传过来的一条SQL语句:SELECT*FROMBigDataTest,缓冲管理器数据缓存首先从磁盘数据库中取出符合条件的结果集,然后放入缓冲池数据缓冲区,并然后以结果集的形式返回给缓存管理器,供访问方法返回给关系引擎的查询执行器,再到协议层,返回给客户端。注意,这里操作的是缓冲池中的数据,不是磁盘DB中的数据,操作后的缓冲池数据不会立即写入磁盘,所以查询结果会和BD中的结果不一致,也就是所谓的脏读。bufferpool主要包括两部分:plancache(生成执行计划非常耗时耗资源,plancache主要用于存储执行计划以供后续使用)和datacache(通常是其中最大容量的)缓存池,内存消耗***,从磁盘读取的数据页放在这里才能被调用)(6)Disk磁盘主要用于存储持久化资源,如日志资源,数据库资源和缓存池持久性支持等待。3、一个查询的完整过程如下是一个比较完整的查询过程,即查询语句的第二部分:SELECT*FROMBigDataTest的整个过程。4.参考文献【01】《SQL Server 2012 深入解析与性能优化 第3版》ChristianBolton,JustinLangford,GlennBerry,GavinPayne,AmitBanerjee,RobFarley