当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识。(文章文字较多,但对后面优化来说很重要,大家边读边结合图形来理解,会容易很多。加油!)

可以看到,SQL Server内部分成了2个部分:关系引擎和存储引擎。在关系引擎中最大的一个组件是查询优化器。查询优化器唯一和仅有的任务是把我们传入的查询语句生成实际的执行计划
读取数据
我们提交给SQL Server 的查询,通过协议层传给命令分析器。命令分析器会检查我们是否提供了一个语法正确的语句,我们所提到的表和列在数据库里是否存在。命令分析器会生成可以重现我们查询的查询树。查询树会被查询优化器用来生成执行计划。
然后编译后的执行计划会提交给查询执行器。查询执行器的任务是执行执行计划。但是为了以后的重用,首先它会把编译好的执行计划放在执行计划缓存区进行缓存。(SQL Server 中计划缓存会让我们的查询更快,但有时候也会使我们的查询变得更慢,这个计划缓存后面我们会深入的讲解)
执行计划被缓存后,查询执行器与存储引擎进行互动,并在执行计划里执行每个操作。当我们在执行计划里访问数据时,存取方法会向缓冲区管理器读取我们想要指定页。(下篇文章我们将讨论SQL Server中页的更多细节)。现在你只要知道页是8Kb的缓存,在那里存放着我们的表和索引数据。缓冲管理器管理着缓冲池(缓冲池包含执行计划缓存区和数据缓存区),那里存放着我们8kb大小的页。缓冲池是SQL Server的主要内存消耗,它的大小我们可以通过服务器属性->内存->最小、最大服务器内存(MB)来配置。

当请求的页面已经被存在缓冲池时,页会被立即读取。在SQL Server里这个被称为逻辑读。如果请求的页没存在缓冲池,缓冲区管理器会发起异步I/O操作把请求的页从我们的存储子系统中读到缓冲池,这个被称为物理读。( 我们在分析一个语句的性能的时候,都会执行SET STATISTICS IO ON,然后可以就可以看到逻辑读取的次数和物理读取的次数,就是上面讲到的逻辑读和物理读)

在异步I/O操作期间,我们的查询需要一直等到操作结束才继续。在后面我们会继续讲解等待和等待统计的更多细节。 一旦页被读取到缓冲池,页会被请求的访问方法取走。当执行计划执行完成后,产生的数据会通过协议层返回给提交查询的程序。
修改数据
当我们与使用修改数据的TSQL语句(INSERT,UPDATE,DELETE,MERGE)打交道时,存储引擎同样与事务管理器进行交互。事务管理器把执行事务中描述我们所做的改变通过事务日志写到事务文件。当这些日志记录写好后,事务就可以提交了。事务执行有多快,你的数据修改就有多快。
在内存中被修改的页通过称为检查点过程写回存储子系统。默认情况下,检查点每一分钟从缓冲区管理器请求所有的脏页并执行一次。脏页就是在内存里被修改,但还没有写回存储的。一旦脏页被写回存储,这个页就会被标记为干净页。
结尾:
大家有不懂的概念,也不要着急,先记住,后面我们还会经常性的提起它们,相信通过后面的学习的不断深入,你们对这些概念的理解也会越来越具体,越来越深入.
感谢大家2016年的陪伴与信任,2017年我会继续努力,分享更好的文章。在这里也祝大家新年快乐,学有所成,万事如意!
转载自博客园:
http://www.cnblogs.com/woodytu/p/4465288.html




