SQL Server中的执行引擎入门 图解.pdf

SQL Server中的执行引擎入门 图解.pdf

ID:52957616

大小:329.80 KB

页数:5页

时间:2020-04-03

SQL Server中的执行引擎入门 图解.pdf_第1页
SQL Server中的执行引擎入门 图解.pdf_第2页
SQL Server中的执行引擎入门 图解.pdf_第3页
SQL Server中的执行引擎入门 图解.pdf_第4页
SQL Server中的执行引擎入门 图解.pdf_第5页
资源描述:

《SQL Server中的执行引擎入门 图解.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、SQLServer中的执行引擎入门图解当查询优化器(QueryOptimizer)将T-SQL语句解析后并从执行计划中选择最低消耗的执行计划后,具体的执行就会交由执行引擎(ExecutionEngine)来进行执行本文旨在分类讲述执行计划中每一种操作的相关信息。数据访问操作首先最基本的操作就是访问数据。这既可以通过直接访问表,也可以通过访问索引来进行。表内数据的组织方式分为堆(Heap)和B树,其中表中没有建立聚集索引时数据是通过堆进行组织的,这个是无序的,表中建立聚集索引后和非聚集索引的数据都是

2、以B树方式进行组织,这种方式数据是有序存储的。通常来说,非聚集索引仅仅包含整个表的部分列,对于过滤索引,还仅仅包含部分行。除去数据的组织方式不同外,访问数据也分为两种方式,扫描(Scan)和查找(Seek),扫描是扫描整个结构的所有数据,而查找只是查找整个结构中的部分数据。因此可以看出,由于堆是无序的,所以不可能在堆上面进行查找(Seek)操作,而相对于B树的有序,使得在B树中进行查找成为可能。当针对一个以堆组织的表进行数据访问时,就会进行堆扫描,如图1所示。图1.表扫描可以看出,表扫描的图标很清

3、晰的表明表扫描的性质,在一个无序组织表中从头到尾扫描一遍。而对于B树结构的聚集索引和非聚集索引,同样可以进行扫描,通常来讲,为了获取索引表中的所有数据或是获得索引行树占了数据大多数使得扫描的成本小于查找时,会进行聚集索引扫描。如图2所示。图2.聚集索引扫描聚集索引扫描的图标也同样能够清晰的表明聚集索引扫描的性质,找到最左边的叶子节点后,依次扫描所有叶子节点,达到扫描整个结构的作用。当然对于非聚集索引也是同样的概念,如图3所示。图3.非聚集索引的扫描而对于仅仅选择B树结构中的部分数据,索引查找(Se

4、ek)使得B树变得有意义。根据所查找的关键值,可以使得从仅仅从B树根部向下走单一路径,因此免去了扫描不必要页的消耗,图4是查询计划中的一个索引查找。图4.聚集索引查找索引查找的图标也是很传神的,可以看到图标那根线从根节点一路向下到叶子节点。也就是找到所求数据所在的页,不难看出,如果我们需要查找多条数据且分散在不同的页中,这个查找操作需要重复执行很多回,当这个次数大到一定程度时,SQLServer会选择消耗比较低的索引扫描而不是再去重复索引查找。对于非聚集索引查找,概念是一样的,就不再上图片了。书签

5、查找(BookmarkLookup)你也许会想,假如非聚集索引可以快速的找到所求的数据,但遗憾的是,非聚集索引却不包含所有所求列时该怎么办?这时SQLServer会面临两个选择,直接访问基本表去获取数据或是在非聚集索引中找到数据后,再去基本表获得非聚集索引没有覆盖到的所求列。这个选择取决于所估计的行数等统计信息。查询分析器会选择消耗比较少的那个。一个简单的书签查找如图5所示。图5.一个简单的书签查找从图5可以看出,首先通过非聚集索引找到所求的行,但这个索引并不包含所有的列,因此还要额外去基本表中找

6、到这些列,因此要进行键查找,如果基本表是以堆进行组织的,那么这个键查找(KeyLookup)就会变成RID查找(RIDLookup),键查找和RID查找统称为书签查找。不过有时候索引查找所返回的行数过多导致书签查找的性能远不如直接进行扫描操作,因此SQLServer这时会选择扫描而不是书签查找。如图6所示。图6.StateProvinceID列有非聚集索引,但由于返回行数过多,分析器会选择扫描而不是书签查找这个估计是根据统计信息进行的,关于统计信息,可以看我之前的一篇博文:浅谈SQLServer中

7、统计对于查询的影响聚合操作(Aggregation)聚合函数会导致聚合操作。聚合函数是将一个集合的数据按照某种规则汇总成1个数据,或基于分组按照规则汇总成多个数据的过程。一些聚合函数比如:avg,sum,min,另外还有distinct关键字都有可能导致两类聚合操作:流聚合(StreamAggregation)和哈希聚合(HashAggregation)。流聚合(StreamAggregation)流聚合需要再执行聚合函数之前,被聚合的数据集合是有序的,这个有序数据既可以通过执行计划中的Sort进

8、行,也可以直接从聚集或是非聚集索引中直接获得有序数据,另外,没有Groupby的聚合操作被成为标量聚合,这类操作一定是会执行流聚合。比如,我们直接进行标量聚合,如图7所示。图7.流聚合但对于加了Groupby的子句,因为需要数据按照groupby后面的列有序,就需要Sort来保证排序。注意,Sort操作是占用内存的操作,当内存不足时还会去占用tempdb。SQLServer总是会在Sort操作和散列匹配中选择成本最低的。一个需要Sort的操作如图8所示。图8.需要排序的流聚合图8中

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。