SQL Server中的执行引擎入门 图解(4)

来源:asp之家 时间:2012-06-06 20:08:26 

散列聚合(Hash aggregation)

上面的流聚合适合比较少的数据,但是对于相对大一点的表。使用散列集合成本会比排序要低。散列集合通过在内存中建立散列表来实现聚合,因此无需对数据集合进行排序。内存中所建立的散列表以Group by后面的列作为键值,如图9所示。


图9.散列聚合

在内存中建立好散列表后,会按照group by后面的值作为键,然后依次处理集合中的每条数据,当键在散列表中不存在时,向散列表添加条目,当键已经在散列表中存在时,按照规则(规则是聚合函数,比如Sum,avg什么的)计算散列表中的值(Value)。

连接(Join)

当多表连接时(书签查找,索引之间的连接都算),SQL Server会采用三类不同的连接方式:循环嵌套连接(Nested Loops Join),合并连接(Merge Join),散列连接(Hash Join)。这几种连接并不是哪种会比另一种更好,而是每种连接方式都会适应特定场景。

循环嵌套连接(Nested Loops Join)

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

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

循环嵌套连接的图标同样十分传神,处在上面的外部输入(Outer input),这里也就是聚集索引扫描。和处在下面的内部输入(Inner Input),这里也就是聚集索引查找。外部输入仅仅执行一次,根据外部输入满足Join条件的每一行,对内部输入进行查找。这里由于是290行,对于内部输入执行290次。

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

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

根据嵌套循环的原理不难看出,由于外部输入是扫描,内部输入是查找,当两个Join的表外部输入结果集比较小,而内部输入所查找的表非常大时,查询优化器更倾向于选择循环嵌套方式。

标签:执行引擎
0
投稿

猜你喜欢

  • Python利用公共键如何对字典列表进行排序详解

    2022-03-04 01:31:33
  • linux 部署apache服务的步骤

    2022-11-28 02:59:16
  • Python multiprocess pool模块报错pickling error问题解决方法分析

    2021-02-21 04:44:50
  • Python的Tornado Web框架深入解析

    2021-11-28 03:14:51
  • 配置node服务器并且链接微信公众号接口配置步骤详解

    2024-05-03 15:54:12
  • Python BeautifulReport可视化报告代码实例

    2023-11-12 14:53:13
  • python 中的pycrypto 算法加密

    2022-01-07 11:23:33
  • JavaScript 应用技巧集合[推荐]

    2024-05-03 15:06:09
  • Python 按字典dict的键排序,并取出相应的键值放于list中的实例

    2022-01-26 16:48:46
  • Pytorch PyG实现EdgePool图分类

    2022-03-17 15:47:55
  • ASP连接Oracle数据库的例子

    2007-10-02 12:44:00
  • mysql数据库索引损坏及修复经验分享

    2024-01-16 11:22:43
  • 微信小程序实现多文件或者图片上传

    2024-04-29 14:06:10
  • linux实现定时备份mysql数据库的简单方法

    2024-01-16 07:21:57
  • 根据对象的某一属性进行排序的js代码(如:name,age)

    2023-08-31 14:05:43
  • 微信小程序实现上传图片小功能

    2024-04-26 17:11:56
  • Python处理文本换行符实例代码

    2021-08-19 18:31:51
  • 深入Python解释器理解Python中的字节码

    2022-04-28 18:29:33
  • python3实现将json对象存入Redis以及数据的导入导出

    2022-05-05 16:31:27
  • python保存文件方法小结

    2021-09-09 04:13:59
  • asp之家 网络编程 m.aspxhome.com