SQL 提示介绍 hash/merge/concat union
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划。很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用手段。另外如果你是一个公司的dba 并且你对你所维护的数据库了如指掌,对业务也有相当深刻的了解那么查询提示也是你的一把利器。
但是,你所应用的提示是在现在的场景中基于现有的环境下,相对是一个好的方式,不能确保你所给予的提示永久有效,并且随着时间推移,数据量的变更,你所加的提示可能成为噩梦。所以没有充分的把握不要轻易使用提示。
下面说一下union的几个运算符 hash/merge/concat
创建两张表(union使用),并插入测试数据
CREATE TABLE [dbo].[t4](
[a] [int] NULL,
[b] [datetime] NULL,
[c] [uniqueidentifier] NOT NULL,
[d] [nchar](10) NULL,
CONSTRAINT [PK_t4] PRIMARY KEY CLUSTERED
(
[c] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO CREATE TABLE [dbo].[t5](
[a] [int] NULL,
[b] [datetime] NULL,
[c] [uniqueidentifier] NOT NULL,
[d] [nchar](10) NULL,
CONSTRAINT [PK_t5] PRIMARY KEY CLUSTERED
(
[c] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] GO insert into t4
select 1,getdate(),newid(),'test'
go 2000 insert into t5
select 1,getdate(),newid(),'test'
go 5000
我们先看一下正常union all的执行计划,一个正常的串联计划.

下面我们加上提示:


发现加了提示一点效果也没有呀!!! 这是闹哪样? 两个查询什么额外操作都没有因否因为这个而让优化器默认选择串联呢?
下面我们修改一下查询把union all 改成union (这相当于要做一个去重复的操作)

运算符 "串联"不见了 变成了 hash匹配,那么现在是不是可以用提示了呢? 我们试一下....
添加提示option(merge union)

添加提示option(concat union)

这三个计划有什么不一样呢?请继续往下看...^_^
我们继续添加排序操作 order 并去掉c(唯一列的)让去重有效果。



上面的三个提示分别选择的不同的计划,那么下面我们对比前一组来综合说明:
- 第一组(提示无效果的) 这是因为优化器还是很智能的他默认两个结果集的拼接不需要任何去重获排序操作所以适用串行直接进行结果集的拼接。
- 第二组 select * 的时候虽然也用了union (去重复操作)但是没有看到任何distinct的操作,这是select 的字段中包含唯一键(newid),个人认为也是优化器智能的表现,但是在提示concat中出现流聚合的去重操作。
- 第三组 这里默认选择的是merge(比较常规的选择,但也视情况而定)相当于使用Distinct Sort排序操作排序并去重以后做合并,这种选择最好使用于表数据量不算太大(因为大表排序是一个很消耗资源的事情)或者排序的字段是已经过排序的比如(索引扫描)
- hash 提示中的计划有点意外因为正常来说是不会出现Distinct Sort排序操作的,但是因为测试数据中重复数据较大所以在第二张表扫描后优化器选择了Distinct Sort排序操作,(优化器之所以这么选择取决于统计信息5000 distinct-〉1509),正常情况下替换掉Distinct Sort排序操作的方式就是哈序聚合。
- concat 操作相当于直接拼接结果集然后再做去重和排序操作。这里两张表重复数据较少所以没有像上面一样先做Distinct Sort, 如下图:
- 另外还有一种情况就是使用union all 并使用显示的order 这时优化器会强制使用 排序-〉merge 的操作,这个就补贴图了。
总结:对于union方式的选择,个人认为优化器选择的问题不大,一般很少有情况需要使用提示去干预,并不像上一篇的强制并行经常使用。但我们要充分了解优化器的选择,为什么要选择这样的一种执行方式,这也是本例中几种情况混合并添加优化器智能选择的展示原因。另外替换掉Distinct Sort排序操作的方式就是哈序聚合。Distinct Sort排序操作需要的内存和去除重复之前数据集合的数据量成正比,而哈希聚合需要的内存则是和去除重复之后的结果集成正比!所以如果数据行中重复值很多,那么相比而言通过哈希聚合所消耗的内存会少。
SQL 提示介绍 hash/merge/concat union的更多相关文章
- SQL提示介绍-强制并行
查询提示一直是个很有争议的东西,因为他影响了sql server 自己选择执行计划.很多人在问是否应该使用查询提示的时候一般会被告知慎用或不要使用...但是个人认为善用提示在不修改语句的条件下,是常用 ...
- 初学者SQL语句介绍
初学者SQL语句介绍 1.用 Select 子句检索记录 Select 子句是每一个检索数据的查询核心.它告诉数据库引擎返回什么字段. Select 子句的常见形式是: S ...
- Linq无聊练习系列6--Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习
/*********************Any/All/Contains/Concat/Union/Intersect/Except/take/skip/SqlMethods操作练习******* ...
- pl/sql的介绍
为什么需要pl/sql编程? 因为使用纯的sql语句来操作数据库,有先天性的技术缺陷: 1.不能模块编程: 2.执行速度慢: 3.安全性有问题: 4.浪费带宽. pl/sql是什么? pl/sql(p ...
- SQL的介绍及MySQL的安装
基础篇 - SQL 介绍及 MySQL 安装 SQL的介绍及MySQL的安装 课程介绍 本课程为实验楼提供的 MySQL 实验教程,所有的步骤都在实验楼在线实验环境中完成, ...
- oracle PL/SQL的介绍
转自:http://blog.sina.com.cn/s/blog_4c302f060101i4o1.html 一 PL/SQL的介绍 1 PL/SQL是什么? PL/SQL(procedural l ...
- oracle 更改SQL提示
在oracle里面修改SQL提示为数据库名称: SQL>set SQLPROMPT "TEST>"
- 使用oracle的exp命令时,提示出--hash: exp: command not found
使用oracle的exp命令时,提示出--hash: exp: command not found 原因:当你在终端使用exp的命名时,当前的账户,并不是oracle认可的账户. 在安装oracle时 ...
- SQL Mon 介绍
原文:SQL Mon 介绍 这是一个相当高级的SQL Server监控工具,全面监控SQL Server的活动与性能,分析性能瓶颈,给出优化建议. red-gate有一个在线的数据库监控工具,不过那个 ...
随机推荐
- C语言 · 高精度加法
问题描述 输入两个整数a和b,输出这两个整数的和.a和b都不超过100位. 算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储.对于这种问题,一般使用数组来处理. 定义一个数组A ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- 利用on和off方法编写高效的js代码
先说下将这个话题的起因:最近发现公司的功能代码,很多在dom对象删除以后,其声明的绑定在window上的resize事件还一直存在,导致相同的功能代码执行了几次.对于我这种轻微代码洁癖的人来说,简直是 ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
- 12、Struts2表单重复提交
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 用原生js做单页应用
最近在公司接到一个需求,里面有一个三级跳转.类似于选择地址的时候,选择的顺序是:省份->市->区.如果分三个页面跳转,那么体验非常不好,如果引入其他框架做成单页应用,又比较麻烦.所以可以用 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 利用for循环找出1000以内的质数
var n=0; for(var i=2;i<=1000;i++){ var zhishu=true; for(var j=2;j<i;j++){ if(i%j==0){ ...
- 使用github远程仓库
经过几天对github的研究,终于把自己想完成的给解决了,发现google真的有很多解释,但是很多也会出现一些bug,对于初学者真的很多烦恼,所以整理一份,能给初识github的你有所帮助 一,首先, ...