当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2012-06-27 05:00:00  来源:本站整理

SQL Server中的履行引擎入门 图解[MSSQL防范]

赞助商链接



  本文“SQL Server中的履行引擎入门 图解[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
本文旨在分类报告履行筹划中每一种操作的相关信息.

数据拜候操作

首先最基本的操作就是拜候数据.这既可以通过直接拜候表,也可以通过拜候索引来举行.表内数据的组织方法分为堆(Heap)和B树,此中表中没有成立堆积索引时数据是通过堆举行组织的,这个是无序的,表中成立堆积索引后和非堆积索引的数据都是以B树方法举行组织,这种方法数据是有序存储的.普通来说,非堆积索引仅仅包含整个表的部份列,关于过滤索引,还仅仅包含部份行.

除去数据的组织方法差别外,拜候数据也分为两种方法,扫描(Scan)和查找(Seek),扫描是扫描整个构造的全部数据,而查找只是查找整个构造中的部份数据.因此可以看出,由于堆是无序的,所以不大概在堆上面举行查找(Seek)操作,而相关于B树的有序,使得在B树中举行查找成为大概.当针对一个以堆组织的表举行数据拜候时,就会举行堆扫描,如图1所示.

SQL Server中的履行引擎入门 图解

图1.表扫描

可以看出,表扫描的图标很清楚的表明表扫描的性质,在一个无序组织表中重新到尾扫描一遍.

而关于B树构造的堆积索引和非堆积索引,一样可以举行扫描,普通来说,为了获得索引表中的全部数据或是得到索引行树占了数据大大都使得扫描的本钱小于查找时,会举行堆积索引扫描.如图2所示.

SQL Server中的履行引擎入门 图解

图2.堆积索引扫描

堆积索引扫描的图标也一样可以清楚的表明堆积索引扫描的性质,找到最左边的叶子节点后,顺次扫描全部叶子节点,到达扫描整个构造的作用.当然关于非堆积索引也是一样的概念,如图3所示.

SQL Server中的履行引擎入门 图解

图3.非堆积索引的扫描

而关于仅仅挑选B树构造中的部份数据,索引查找(Seek)使得B树变得有意义.按照所查找的关键值,可以使得从仅仅从B树根部向下走单一途径,因此免除了扫描不必要页的损耗,图4是查询筹划中的一个索引查找.

SQL Server中的履行引擎入门 图解

图4.堆积索引查找

索引查找的图标也是很逼真的,可以看到图标那根线从根节点一路向下到叶子节点.也就是找到所求数据所在的页,不丢脸出,假如我们需求查找多条数据且分离在差别的页中,这个查找操作需求反复履行很多回,当这个次数大到一定程度时,SQL Server会挑选损耗对比低的索引扫描而不是再去反复索引查找.关于非堆积索引查找,概念是一样的,就不再上图片了.

书签查找(Bookmark Lookup)

你大概会想,假定非堆积索引可以快速的找到所求的数据,但遗憾的是,非堆积索引却不包含全部所求列时该怎么办?这时SQL Server会面对两个挑选,直接拜候基本表去获得数据或是在非堆积索引中找到数据后,再去基本表得到非堆积索引没有覆盖到的所求列.这个挑选取决于所预计的行数等统计信息.查询解析器会挑选损耗对比少的那个.

一个简单的书签查找如图5所示.

SQL Server中的履行引擎入门 图解

图5.一个简单的书签查找

从图5可以看出,首先通过非堆积索引找到所求的行,但这个索引并不包含全部的列,因此还要额外去基本表中找到这些列,因此要举行键查找,假如基本表是以堆举行组织的,那么这个键查找(Key Lookup)就会变成RID查找(RID Lookup),键查找和RID查找统称为书签查找.

不过有时刻索引查找所返回的行数过量招致书签查找的性能远不如直接举行扫描操作,因此SQL Server这时会挑选扫描而不是书签查找.如图6所示.

SQL Server中的履行引擎入门 图解

图6.StateProvinceID列有非堆积索引,但由于返回行数过量,解析器会挑选扫描而不是书签查找

这个预计是按照统计信息举行的,关于统计信息,可以看我之前的一篇博文:浅谈SQL Server中统计关于查询的影响

聚合操作(Aggregation)

聚合函数会招致聚合操作.聚合函数是将一个调集的数据按照某种法则汇总成1个数据,或基于分组按照法则汇总成多个数据的历程.一些聚合函数比方:avg,sum,min,别的还有distinct关键字都有大概招致两类聚合操作:流聚合(Stream Aggregation)和哈希聚合(Hash Aggregation).

流聚合(Stream Aggregation)

流聚合需求再履行聚合函数之前,被聚合的数据调集是有序的,这个有序数据既可以通过履行筹划中的Sort举行,也可以直接从堆积或是非堆积索引中直接得到有序数据,别的,没有Group by的聚合操作被成为标量聚合,这类操作一定是会履行流聚合.

比方,我们直接举行标量聚合,如图7所示.

SQL Server中的履行引擎入门 图解

图7.流聚合

但关于加了Group by的子句,因为需求数据按照group by 背面的列有序,就需求Sort来保证排序.注意,Sort操作是占用内存的操作,当内存不足时还会去占用tempdb.SQL Server老是会在Sort操作和散列匹配中挑选本钱最低的.一个需求Sort的操作如图8所示.

SQL Server中的履行引擎入门 图解

图8.需求排序的流聚合

图8中排序操作按照ProductLine举行排序后,然后就按照各自的分组做聚合操作了.

散列聚合(Hash aggregation)

上面的流聚符合合对比少的数据,但是关于相对大一点的表.利用散列调集本钱会比排序要低.散列调集通过在内存中成立散列表来实现聚合,因此无需对数据调集举行排序.内存中所成立的散列表以Group by背面的列作为键值,如图9所示.

SQL Server中的履行引擎入门 图解
图9.散列聚合

在内存中成立好散列表后,会按照group by背面的值作为键,然后顺次处理调集合的每条数据,当键在散列表中不存在时,向散列表增添条目,当键已经在散列表中存在时,按照法则(法则是聚合函数,比方Sum,avg什么的)计算散列表中的值(Value).

衔接(Join)

当多表衔接时(书签查找,索引之间的衔接都算),SQL Server会采取三类差别的衔接方法:循环嵌套衔接(Nested Loops Join),归并衔接(Merge Join),散列衔接(Hash Join).这几种衔接并非哪类会比另一种更好,而是每种衔接方法城市适应特定场景.

循环嵌套衔接(Nested Loops Join)

由图10可以看到一个简单的循环嵌套衔接.

SQL Server中的履行引擎入门 图解

图10.一个循环嵌套衔接的实例

循环嵌套衔接的图标一样非常逼真,处在上面的外部输入(Outer input),这里也就是堆积索引扫描.和处在下面的内部输入(Inner Input),这里也就是堆积索引查找.外部输入仅仅履行一次,按照外部输入满意Join条件的每一行,对内部输入举行查找.这里由于是290行,关于内部输入履行290次.

可以通过属性窗口看到.如图11所示:

SQL Server中的履行引擎入门 图解

图11.内部输入的履行次数

按照嵌套循环的原理不丢脸出,由于外部输入是扫描,内部输入是查找,当两个Join的表外部输入后果集对比小,而内部输入所查找的表非常大时,查询优化器更偏向于挑选循环嵌套方法.

归并衔接(Merge Join)

差别于循环嵌套的是,归并衔接是从每个表仅仅履行一次拜候.从这个原理来看,归并衔接要比循环嵌套要快了不少.下面来看一个典型的归并衔接,如图12所示.

SQL Server中的履行引擎入门 图解

图12.归并衔接

从归并衔接的原理不难想象,首先归并衔接需求双方有序.并且要求Join的条件为等于号.因为两个输入条件已经有序,所以从每一个输入调集合取一行举行对比,相等的返回,不相等的舍弃,从这里也不丢脸出Merge join为什么只答应Join背面是等于号.从图11的图标中我们可以看出这个原理.

假如输入数据的双方无序,则查询解析器不会挑选归并衔接,我们也可以通过索引提醒强迫利用归并衔接,为了到达这一目的,履行筹划必须加上一个排序步骤来实现有序,如图13所示.

SQL Server中的履行引擎入门 图解

图13.通过排序来实现Merge Join

散列衔接(Hash Join)

散列衔接一样仅仅只需求只拜候1次双方的数据.散列衔接通过在内存中成立散列表实现.这对比损耗内存,假如内存不足还会占用tempdb.但并不像归并衔接那样需求双方有序.一个典型的散列衔接如图14所示.

SQL Server中的履行引擎入门 图解

图14.散列衔接

这里我删除了Costomer的堆积索引,不然两个有序输入SQL Server会挑选代价更低的归并衔接.SQL Server操纵两个上面的输入生成哈希表,下面的输入来探测,可以在属性窗口看到这些信息,如图15所示.

SQL Server中的履行引擎入门 图解

图15.散列键生成和散列键探测

普通来说,在两个输入数据对比大,且所求数据在此中一方或双方没有排序的条件达成时,会选用散列匹配.

并行

当多个表衔接时,SQL Server还答应在多CPU或多核的情形下答应查询并行,这样无疑提高了效率,一个并行的例子如图16所示.

SQL Server中的履行引擎入门 图解

图16.并行提高效率

总结

本文简单介绍了SQL Server履行筹划中常见的操作极端原理,理解这些步骤和原理是优化查询的基本功.


  以上是“SQL Server中的履行引擎入门 图解[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Windows 搭配 IIS7 PHP MySQL 环境
  • sqlserver索引的原理及索引成立的注意事项小结
  • SQL Join的一些总结(实例)
  • SQL的Join利用图解教程
  • SQL中JOIN和UNION辨别、用法及示例介绍
  • 关于SQL中CTE(公用表表达式)(Common Table Expression)的总结
  • mysql Out of memory (Needed 16777224 bytes)的错误办理
  • mysql提醒[Warning] Invalid (old?) table or database name问题的办理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • mysql启用skip-name-resolve情势时呈现Warning的处理办法
  • MySQL Order By语法介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .