SQL Server常见的操作符
常见的操作符:Sort、Hash Match(聚合)、Filter、Compute Scalar等
一:Sort
select Shelf from Production.ProductInventory order by Shelf
在进行聚集索引扫描操作后,数据集进行了Sort操作。当优化器认为在执行过程中需要对数据尽心排序时,就会产生这个操作。
整个查询对1069行数据进行了排序操作。排序操作本身不是问题,问题是他的开销已经达到了76%。因为没有索引存在。只能执行Sort操作,这个列子是缺少了where条件,返回了非预期的数据;也可能因为缺少具有排序功能的索引,使用聚集索引可以实现预排序功能,从而减少了排序开销。
可以Order By一个聚集索引来消除Sort操作。
select * from Production.ProductInventory order by ProductID
加入了Order By子句,但是执行计划并没有出现Sort操作符,因为这个聚集索引以及你按顺序存储了数据,优化器会认为没有必要再次排序。如果必须排序,Sql Server会优先选择在内存中进行,如果排序的数据集实在太大,SQL Server就只能把数据放在TempDB中并在磁盘中排序。这时候会触发Sort Warning事件。
2.Hash Match(聚合)
在查询中需要进行聚合操作(COUNT/SUM/AVG/MAX/MIN)有时就可能出现这种操作符
select City,COUNT(City) as CityCount from Person.Address group by City
该语句没有 Where 条件,所以使用Index Scan来返回全部的数据,然后优化器使用聚集索引来实现COUNT的逻辑。由于数据量比较大,所以优化器会选择Hash Match聚合操作符。首先在内存中创建临时哈希表,然后计算满足GROUP BY条件的数据,最终汇总数据并返回
聚合操作是昂贵的操作,可能只有通过添加有效的WHERE条件或者通过使用索引视图预先聚合的方式来提高性能。
3.Filter
select City,COUNT(City) as CityCount from Person.Address group by city having COUNT(City)>1
当引入HAVING子句后,就出现了Filter操作符,这个操作符会对输出再次进行限制,可以对比Filter前后的数据量
如图:
要注意:看上去HAVING子句减少了数据量,但是实际并没有,因为HAVING子句只会在聚合操作完成后才进行,而常见的性能问题都在聚合操作之前,所以除了添加WHERE条件控制聚合的数据量之外,这种可操作符没有什么可提升空间
4.Compute Scalar --计算标量
这个操作符主要用于标量操作,通常出现在SELECT过程中,需要重新组合数据列
select e.JobTitle,
a.City,
p.LastName+', '+p.FirstName as EmployeeName
from HumanResources.Employee as e
join Person.BusinessEntityAddress as bea on e.BusinessEntityID=bea.BusinessEntityID
join Person.Address a on bea.AddressID=a.AddressID
join Person.Person as p on e.BusinessEntityID=p.BusinessEntityID
在这个查询中LastName和FirstName合并成了一个新列EmployeeName,这种操作符没有什么问题,但是如果在WHERE、JOIN的ON条件中出现,那可能表示存在问题,需要考虑使用计算列等方式来改进
SQL Server常见的操作符的更多相关文章
- SQL Server 执行计划操作符详解(3)——计算标量(Compute Scalar)
接上文:SQL Server 执行计划操作符详解(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介绍第 ...
- SQL Server 执行计划操作符详解(2)——串联(Concatenation )
本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...
- SQL Server 运行计划操作符具体解释(2)——串联(Concatenation )
本文接上文:SQL Server 运行计划操作符具体解释(1)--断言(Assert) 前言: 依据计划.本文開始讲述另外一个操作符串联(Concatenation).读者能够依据这个词(中英文均可) ...
- SQL Server 运行计划操作符具体解释(3)——计算标量(Compute Scalar)
接上文:SQL Server 运行计划操作符详细解释(2)--串联(Concatenation ) 前言: 前面两篇文章介绍了关于串联(Concatenation)和断言(Assert)操作符,本文介 ...
- SQL Server常见数据类型介绍
数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 1.整数类型 int 存储范围是-2,147,483,648到2,147,483 ...
- SQL Server 常见数据类型介绍
数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅. 整数类型 int 存储范围是-2,147,483,648到2,147,483,6 ...
- SQL SERVER常见等待——解决会话等待产生的系统问题
SQL SERVER——解决会话等待产生的系统问题 转自: https://blog.csdn.net/z_cloud_for_SQL/article/details/55051215 版权声明:SQ ...
- SQL Server 执行计划操作符详解(1)——断言(Assert)
前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使--把执行计划发出来看看.当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙.根据本人经验,大量的性能问题单纯从语句来看很 ...
- SQL Server 运行计划操作符具体解释(1)——断言(Assert)
前言: 非常多非常多地方对于语句的优化,一般比較靠谱的回复即使--把运行计划发出来看看.当然那些仅仅看语句就说怎样怎样改代码,我一直都是拒绝的,由于这样的算是纯蒙.依据本人经验,大量的性能问题单纯从语 ...
随机推荐
- Zookeeper学习笔记2
环境搭建 JDK(>1.6)安装 略 Zookeeper安装 1.下载 http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3. ...
- canves绘制北京地铁线路图,包括线路绘制,优先路线,单路径选择。
canves绘制北京地铁线路图,包括线路绘制,优先路线,单路径选择. 即将推出,后台涵盖各种语言,php,C#,java,nodejs等.
- Linux内核调试:kdump、vmcore、crash、kernel-debuginfo【转】
转自:https://blog.csdn.net/guowenyan001/article/details/19807555 一.简介 linux内核发送崩溃时,kdump会生成一个内核转储文件vmc ...
- 工作流程引挈 https://www.flowable.org/
工作流程引挈 : https://www.flowable.org/ 起源:JBPM,Activiti
- 解决:error LNK2026: 模块对于 SAFESEH 映像是不安全的
用vs2017编译比较老的vc++项目,出现这个错误,解决方案如下: 1.打开该项目的[属性]对话框, 2.点击[链接器]选项, 3.点击[命令行]选项, 4.将 [/SAFESEH:NO ]键入[其 ...
- 利用URLConnection http协议实现webservice接口功能(附HttpUtil.java)
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- codeforces 955F Cowmpany Cowmpensation 树上DP+多项式插值
给一个树,每个点的权值为正整数,且不能超过自己的父节点,根节点的最高权值不超过D 问一共有多少种分配工资的方式? 题解: A immediate simple observation is that ...
- where 和 having区别
WHERE语句在GROUP BY语句之前:SQL会在分组之前计算WHERE语句. HAVING语句在GROUP BY语句之后:SQL会在分组之后计算HAVING语句.
- centos如何安装Python3
Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...
- LVM初级配置
步骤: 1.将物理硬盘转换成物理卷(PV) 创建PV:pvcreate /dev/vdb 2.将PV添加到卷组中(VG) vgcreate vg0 /dev/vdb 3.创建逻辑卷(LV)并从VG中调 ...