SQL Server中的执行引擎入门 图解(4)
来源:asp之家 时间:2012-06-06 20:08:26
散列聚合(Hash aggregation)
上面的流聚合适合比较少的数据,但是对于相对大一点的表。使用散列集合成本会比排序要低。散列集合通过在内存中建立散列表来实现聚合,因此无需对数据集合进行排序。内存中所建立的散列表以Group by后面的列作为键值,如图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的表外部输入结果集比较小,而内部输入所查找的表非常大时,查询优化器更倾向于选择循环嵌套方式。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Python利用公共键如何对字典列表进行排序详解
linux 部署apache服务的步骤
Python multiprocess pool模块报错pickling error问题解决方法分析
Python的Tornado Web框架深入解析
配置node服务器并且链接微信公众号接口配置步骤详解
Python BeautifulReport可视化报告代码实例
![](https://img.aspxhome.com/file/2023/4/64314_0s.png)
python 中的pycrypto 算法加密
JavaScript 应用技巧集合[推荐]
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
Pytorch PyG实现EdgePool图分类
ASP连接Oracle数据库的例子
mysql数据库索引损坏及修复经验分享
微信小程序实现多文件或者图片上传
![](https://img.aspxhome.com/file/2023/8/130878_0s.jpg)
linux实现定时备份mysql数据库的简单方法
根据对象的某一属性进行排序的js代码(如:name,age)
微信小程序实现上传图片小功能
![](https://img.aspxhome.com/file/2023/4/135634_0s.jpg)
Python处理文本换行符实例代码
![](https://img.aspxhome.com/file/2023/5/67225_0s.png)
深入Python解释器理解Python中的字节码
![](https://img.aspxhome.com/file/2023/4/123844_0s.jpg)
python3实现将json对象存入Redis以及数据的导入导出
![](https://img.aspxhome.com/file/2023/6/103366_0s.jpg)