Inside Microsoft SQL Server 2005:T-SQL Querying (查询处理的数据流程|第二章)

在SQL Server Management Studio(SSMS)中查询

 
  
 
  
 
  
 
  

 

如上例所示,SQL语句执行时,SQL Server Analyer(2005后合并入SQL Server Management Studio中)会根据语句自动的优化执行计划。通常,一个批处理可以是多个SQL语句组成的一个单位。(存储过程就是个很好的例子,又如GO语句会将SQL语句自动切割)

SQL语句处理过程包括几步:语法解析、连接、编译与执行。可以在执行前编译或者编译后存在缓存中等待下一次执行,所以用户常常不能感觉到编译与执行的存在。优化器会考虑到系统CPU个数、内存总量,主要优化过程如下

语法解析包含检查SQL语句的语法错误,检查实体名称等;连接用于确认SQL语句中的实体是否可以被访问;优化只优化那个可能存在多种途径访问数据库的语法。

连接器(Algebrizer)

Algebrizer是SQL Server 2005中的连接器,用于取代SQL Server 2000中的normalizer,主要有如下功能:

操作挤压:Algebrizer可以简化操作符,语法解析器通常把UNION、AND、OR这样的操作简化为二进制,如下图左,而连接器可以将操作符转换为n元操作符,如下图右

名称解析:连接器通过实际测试table、column等信息检查实体名称是否正确

类型推导:连接器从所有所有table最基本的column开始推导数据类型,一层层向上,考虑子结点类型与父子关系推导出所有结果的类型。这样可以解决类似UNION,CONVERT等关键字造成的类型转换。

聚类连接:连接器分析聚类函数并决定聚类函数执行的位置,通常聚类函数会在outer query中执行。

分组连接:分组连接保证除了聚合函数以外的所有出现在SELECT关键字后的column都必须出现在GROUP BY关键字后

优化器

SQL Server的优化器是基于开销设计的优化器,也就是说它会返回一个开销最少的执行计划,通常这个开销被定义为优化器估计的SQL语句执行时间。优化器会考虑很多种执行方案,选出一个合适的执行计划,对于执行方案太多的SQL语句,优化器并不会考虑所有方案,而是寻找一个接近理论值的可行方案。

需要注意的是,优化器不会真正地去执行计划,而是估计。并且时间最小的方案有可能资源开销比较大。

优化器通常也会包含几个步骤,第一个步骤为寻找开销最小的计划(Trivial plan),如果该语句的执行可以有几种方案,那么优化器会从中选择一个开销最小的方案。第二个步骤为简化(Simplification),优化器会分析SQL语句中的操作符等,对他们进行重新排列来简化SQL语句,例如,包含过滤条件的join语句通常可以先执行过滤条件再执行join语句。第三个步骤为基于开销的优化步骤,倘若优化器比较每个方案再选择一个方案,通常花费在方案选择上的时间可能超过执行语句本身的时间,因此优化器将第三个步骤分为三个阶段,当某个阶段优化后语句开销已经在可以接受的范围内,优化器将不会对语句继续进行优化,优化步骤如下:

第一阶段为事务处理阶段(Transaction Processing phase),优化器主要考虑哈希连接与嵌套循环;第二个阶段为快速计划优化,优化器主要考虑非平行的执行计划;第三个阶段为完全计划优化,优化器会考虑平行的执行计划。

SQL Server 2005提供了一个名为sys.dm_exec_query_optimizer_info的动态管理视图(DMV)用于查看自SQl Server上一次启动后的优化信息。

查询计划

SQL Server 2005可以有三种格式来提供查询计划的展示:图形、文字和XML。下表展示了调用相关展示的命令。

Format
Content Text XML Graphical
Operators SET SHOWPLAN_TEXT ON N/A N/A
Operators and estimated costs SET SHOWPLAN_ALL ON SET SHOWPLAN_XML ON Display Estimated Execution Plan in Management Studio
Run-time info SET STATISTICS PROFILE ON SET STATISTICS XML ON Include Actual Execution Plan in Management Studio

Text模式会用文字展示出操作的步骤;XML模式可以提供更多的属性以及最全面的内容;Graphical模式有两种方法:(1)Display Estimated Execution Plan,这个方法能够立即显示出优化之后的处理流程(2)Include Actual Execution Plan,这个方法显示实际执行的计划,该图形中可以包含每个步骤中具体的一些属性。

查询缓存中的计划

SQL 语句经过编译之后会储存在缓存中(Procedure Cache),我们可以通过一些函数来查看缓存中的SHOWPLAN,例如:缓存目录sys.syscahcheobjects,清空缓存的命令DBCC PROCCACHE

名为sys.dm_exec_query_plan的动态管理函数返回缓存中的查询的执行计划;名为sys.dm_exec_query_stats的动态管理视图返回缓存中对应的标识符

更新计划

更新计划通常包含两层,第一层为更新的相关内容,第二层为有效性的检查。更新计划包含两种:每行更新与每键键更新。每行更新代码比较简洁,CPU效率很高,而每键更新I/O效率很高,减少了index page的重复访问次数。

你可能感兴趣的:(Inside,SQL,Server,2005,T-SQL,Querying,学习笔记)