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条件中出现,那可能表示存在问题,需要考虑使用计算列等方式来改进

原文地址:https://www.cnblogs.com/sunliyuan/p/9784248.html

时间: 2024-12-23 00:07:59

SQL Server常见的操作符的相关文章

SQL Server 运行计划操作符具体解释(2)——串联(Concatenation )

本文接上文:SQL Server 运行计划操作符具体解释(1)--断言(Assert) 前言: 依据计划.本文開始讲述另外一个操作符串联(Concatenation).读者能够依据这个词(中英文均可)先幻想一下是干嘛的.事实上还是挺直观,就是把东西连起来.那么以下我们来看看究竟连什么?怎么连?什么时候连? 简单介绍: 串联操作符既是物理操作符,也是逻辑操作符.在中文版SQL Server的图形化运行计划中称为"串联",在其它格式及英文版本号中称为"Concatenation&

SQL Server 执行计划操作符详解(2)——串联(Concatenation )

本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻想一下是干嘛的.其实还是挺直观,就是把东西连起来,那么下面我们来看看到底连什么?怎么连?什么时候连? 简介: 串联操作符既是物理操作符,也是逻辑操作符,在中文版SQL Server的图形化执行计划中称为"串联",在其他格式及英文版本中称为"Concatenation".

SQL Server常见数据类型的介绍

数据表是由多个列组成,创建表时必须明确每个列的数据类型.以下列举SQL Server常见数据类型的使用规则. 整数类型 int 存储范围是-2,147,483,648到2,147,483,647之间的整数,主键列常设置此类型.(每个数值占用 4字节) smallint 存储范围是-32,768 到 32,767 之间的整数,用来存储限定在特定数值范围内的数据.(每个数值占用 2 字节) tinyint 存储范围是0到255 之间的整数,用来存储有限数目的数值.(每个数值占用 1 字节) bigi

SQL Server常见数据类型介绍

数据表是由多个列组成,创建表时必须明确每个列的数据类型,以下列举SQL Server常见数据类型的使用规则,方便查阅 Character 字符串: 数据类型 描述 存储 char(n) 固定长度的字符串.最多 8,000 个字符. n varchar(n) 可变长度的字符串.最多 8,000 个字符.   varchar(max) 可变长度的字符串.最多 1,073,741,824 个字符.   text 可变长度的字符串.最多 2GB 字符数据.   Unicode 字符串: 数据类型 描述

SQL Server 执行计划操作符详解(1)——断言(Assert

前言: 很多很多地方对于语句的优化,一般比较靠谱的回复即使--把执行计划发出来看看.当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙.根据本人经验,大量的性能问题单纯从语句来看很难发现瓶颈,同一个语句,由于环境的不同,差距非常大,所以比较合适的还是分析执行计划. 那么对于执行计划,一般使用图形化执行计划就差不多了,但是用过的人也有一些疑惑,里面的图标(称为操作符)并不非常直观.所以从本文开始,会整理一些不怎么常见但由比较重要的操作符并进行解释,对于那些表扫描.索引扫描.聚集

sql server常见配置函数及其功能

配置函数用于返回配置选项的设置信息,常见如下: [email protected]@DATEFIRST 针对会话返回SET DATEFIRST的当前值,set  datefirst表示指定的每周的第一天, 美国英语中默认1对应星期一,2对应星期二,以此类推,7对应周日,周日在西方表示每周的第一天 示例:以下设置5,周五作为每周的第一天,并假定今天是周五,即今日是以周五为第一天 set datefirst 5 go select @@DATEFIRST 第一天,datepart(DW,getdat

sql server 常见错误代码15000 - 15999含义解析

错误 15000 - 15999 SQL Server 2008 R2 其他版本 错误 严重性 是否记录事件 说明(消息正文) 15001 16 否 对象 '%ls' 不存在或不是此操作的有效对象. 15002 16 否 无法在事务中执行过程 '%s'. 15003 16 否 只有 %s 角色的成员才能执行此存储过程. 15004 16 否 名称不能是 NULL. 15005 10 否 已更新了所有表的统计信息. 15006 16 否 '%s' 是无效名称,因为其中包含无效字符. 15007 1

SQL Server常见操作

1. 常见操作(增删改查) --1. Create Table USE [MVC_000] CREATE TABLE T_TableName ( ID INT IDENTITY(1,1) PRIMARY KEY, Name VARCHAR(50) UNIQUE, Age INT, HomeAddress VARCHAR(50) ) --2. Insert data into table:T_TableName INSERT INTO T_TableName(Name,Age,HomeAddres

SQL server常见数据类型的了解

     大体的分为 字符,2进制,数值,日期,其他类型 字符 char 是定长的.如char(8),你输入的字符小于8时,它会再后面补空值.当你输入的字符大于指定的数时,它会截取超出的字符. varchar(n) 包含 n 个字节的可变长度且非 Unicode 的字符数据.n 的值(1 - 8,000),存储大小为输入数据的字节的实际长度,而不是 n 个字节.所输入的数据字符长度可以为零.nvarchar(n) 包含 n 个字符的可变长度 Unicode 字符数据.n 的值(1 - 4,000