SQL Server执行计划那些事儿(1)——哈希、合并、嵌套联接的选择
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混)。当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下。
开门见山,直接入题
在进行Join的时候,数据库优化器是怎么进行联接呢?下面我们也详细的讲述。
在SQL Server中,有3中Join的策略——哈希匹配(Hash)、合并(Merge)、嵌套循环(Nested Loop).
在理解者三种联接策略之前,我们先来简单了解下哈希匹配联接、合并联接、嵌套循环联接,
哈希匹配联接:这种联接有两种输入,即建立输入和探测输入。首先SQL Server会根据统计信息从两张表中筛选出较小的表作为建立输入,并且读入所有行,然后在内存中根据关联条件建立一个哈希表。在整个建立阶段完成之后就进入探测阶段。以后一行一行的对探测输入进行扫描和计算,并为每个探测行计算哈希值,然后进行匹配(当然这里也分多种情况,建立输入大于可用内存时等其他情况)。
合并联接:合并连接要求两个输入都要在合并列上排序。由于每个输入都已排序,因此Merge Join运算符将从每个输入中获取一行进行比较,如果行相等则进行返回,不等则舍弃。当数据量不大的时候,这种联接方式比哈希匹配更加有效。
嵌套循环联接:嵌套循环也称“嵌套迭代”,他将一个联接输入用作外部输入表,将另一个联接输入用作内部输入表。外部循环逐行处理外部输入表。内部循环逐行处理外部输入表,内部循环会针对每个外部行执行,在内部输入表中搜索匹配的行。
通过上面的介绍,我们也能分析出来(可以根据时间复杂度,和空间复杂度),以上三种联接并没有绝对的优劣。
大致可以分一下几种情况:
(1)当数据量容量很大,且未排序的情况下,哈希匹配要优于其他两种。
(2)当属数据已经排序,且数据量不大的之后,合并连接更加有效。
(3)当结果集比较小,且数据容量不大的时候嵌套循环比较合适。
下面我们可以通过测试来查看SQL Server优化器的选择。
我们先创建两张表(Headers和Details):
1.执行下面查询,查看执行计划:
select *
from Headers
inner join Details on Headers.ID=Details.HeaderID
go
2.查看执行计划,可以看出查询优化器使用了哈希匹配:
3.在两表中创建聚集索引
create nonclustered index index_details_headerID on details(headerID)
create unique clustered index index_details_ID_headerID on details(headerID,ID)
4、执行上面查询,开启执行计划,可以看出此时优化器使用了合并联接
5.现在执行下面查询语句(带where 过滤):
select *from Headers inner join Details on Headers.ID=Details.HeaderID where Details.ID=500
6.通过查看执行计划得出,当结果集比较小的时候优化器选择了嵌套循环:
总结
通过上面的我们可以得出,三种联接各有优略,视乎情况而定。但是如果可以的话,应该在关联列上建立索引。
SQL Server执行计划那些事儿(1)——哈希、合并、嵌套联接的选择的更多相关文章
- SQL Server执行计划那些事儿(3)——书签查找
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...
- SQL Server执行计划那些事儿(2)——查找和扫描
接下来的文章是记录自己曾经的盲点,同时也透漏了自己的发展历程(可能发展也算不上,只能说是瞎混).当然,一些盲点也在工作和探究过程中慢慢有些眉目,现在也愿意发扬博客园的奉献精神,拿出来和大家分享一下. ...
- SQL Server 执行计划缓存
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之 ...
- sql server 执行计划(execution plan)介绍
大纲:目的介绍sql server 中执行计划的大致使用,当遇到查询性能瓶颈时,可以发挥用处,而且带有比较详细的学习文档和计划,阅读者可以按照我计划进行,从而达到对执行计划一个比较系统的学习. 什么是 ...
- SQL Server 执行计划中的扫描方式举例说明
SQL Server 执行计划中的扫描方式举例说明 原文地址:http://www.cnblogs.com/zihunqingxin/p/3201155.html 1.执行计划使用方式 选中需要执行的 ...
- 引用:初探Sql Server 执行计划及Sql查询优化
原文:引用:初探Sql Server 执行计划及Sql查询优化 初探Sql Server 执行计划及Sql查询优化 收藏 MSSQL优化之————探索MSSQL执行计划 作者:no_mIss 最近总想 ...
- SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)
接上文:SQL Server 执行计划操作符详解(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介绍第 ...
- SQL Server 执行计划操作符详解(2)——串联(Concatenation )
本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...
- 浅析SQL SERVER执行计划中的各类怪相
在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的 ...
随机推荐
- docker学习笔记(1)
(1)Docker介绍 关于Docker的介绍,我就不列举出来了.到百度.谷歌搜索.非常多介绍文章.以下我给出官网的介绍:https://www.docker.com/whatisdocker/ (2 ...
- Codeforces #245(div2)
A:A. Points and Segments (easy) 题目看了n久,開始认为尼玛这是div2的题目么,题目还标明了easy.. 意思是给你一n个点,m个区间,在n个点上放蓝球或者红球,然后让 ...
- SecureCRT中文显示乱码的解决方法
注:本文出自:http://riching.iteye.com/blog/349754 最近开始用SecureCRT登陆linux系统,由于是新手,很多问题不清楚,碰到显示中文乱码的问题,困扰了好几天 ...
- jQuery.innerWidth() 函数详解
innerWidth()函数用于设置或返回当前匹配元素的内宽度. 内宽度包括元素的内边距(padding),但不包括外边距(margin).边框(border)等部分的高度.如下图: 如果你要获取 ...
- node.js querystring处理参数
C:\Documents and Settings\Administrator\WebstormProjects\untitled6>node> url{ parse: [Function ...
- RDLC报表系列(六) 多图表-折线图和柱状图
美好的一天开始了,这篇是RDLC系列的最后一篇文章,我的小项目也已经release,正在测试中. 1.新建demo3.aspx和demo3.rdlc文件 2.往rdlc文件中拖一个图标控件,在弹出的窗 ...
- android的color整理(一)
很全面的颜色收集方便以后使用. <!-- 白色 --> <color name="ivory">#fffff0</color> <!-- ...
- currentStyle、getComputedStyle
element.offsetWidth: 返回元素的宽度,包括边框和内边距. element.offsetHeight: 返回元素的高度,包括边框和内边距. currentStyle: 获取计算后的样 ...
- VB.NET 初涉线程的定义和调用
什么是线程 说话一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独 ...
- Android WebView 小结
1.设置网页的缩放比例的时候,可以使用以下属性: mWebview.setInitialScale(25);//为25%,最小缩放等级 WebSettings setting = mWebview.g ...