SQL Server调优系列基础篇(联合运算符总结)

前言html

上两篇文章咱们介绍了查看查询计划的方式,以及一些经常使用的链接运算符的优化技巧,本篇咱们总结联合运算符的使用方式和优化技巧。算法

废话少说,直接进入本篇的主题。post

技术准备性能

基于SQL Server2008R2版本,利用微软的一个更简洁的案例库(Northwind)进行解析。大数据

1、联合运算符优化

所谓的联合运算符,其实应用最多的就两种:UNION ALL和UNION。url

这两个运算符用法很简单,前者是将两个数据集结果合并,后者则是合并后进行去重操做,若是有过写T-SQL语句的码农都不会陌生。spa

咱们来分析下这两个运算符在执行计划中的显示,举个例子线程

SELECT FirstName+N''+LastName,City,Country FROM Employees
UNION ALL
SELECT ContactName,City,Country FROM Customers

就是上面这个图标了,这就是UNION ALL联合运算符的图标。3d

这个联合运算符很简单的操做,将两个数据集合扫描完经过联合将结果汇总。

咱们来看一下UNION 这个运算符,例子以下

select City,Country from Employees
UNION
SELECT City,Country FROM Customers

咱们能够看到,UNION 运算符是在串联运算符以后发生了一个Distinct Sort排序操做,通过这个操做会将结果集合中的重复值去掉。

咱们一直强调:大数据表的排序是一个很是耗资源的动做!

因此,到这里咱们已经找到了可优化的选项,去掉排序,或者更改排序方式。

替换掉Distinct Sort排序操做的方式就是哈序聚合。Distinct Sort排序操做须要的内存和去除重复以前数据集合的数据量成正比,而哈希聚合须要的内存则是和去除重复以后的结果集成正比!

因此若是数据行中重复值不少,那么相比而言经过哈希聚合所消耗的内存会少。

咱们来举个例子

select ShipCountry from Orders
UNION
SELECT ShipCountry FROM Orders

这个例子其实没啥用处,这里就是为了演示,咱们来看一下结果

咱们知道,这张表里这个ShipCountry是存在大面积重复值的,因此采用了哈希匹配来去重操做是最优的方式。

其实,相比哈希匹配链接还有一种更轻量级的去重的链接方式:合并链接

上一篇我已经分析了这个链接方法,用于两个数据集的链接方式,这里其实相似,应用前都必须先将原结果集合排序!

咱们知道优化的方式能够采用创建索引来提升排序速度。

咱们来重现这种去重方式,咱们新建一个表,而后创建索引,代码以下

--新建表
SELECT EmployeeID,FirstName+N' '+LastName AS ContactName,City,Country
INTO NewEmployees
FROM Employees
GO
--添加索引
ALTER TABLE NewEmployees ADD CONSTRAINT PK_NewEmployees PRIMARY KEY(EmployeeID)
CREATE INDEX ContactName ON NewEmployees(ContactName)
CREATE INDEX ContactName ON CUSTOMERS(ContactName)
GO
--新建查询,这里必定要加上一个显示的Order by才能出现合并链接去重
SELECT ContactName FROM NewEmployees
UNION ALL
SELECT ContactName FROM Customers
ORDER BY ContactName

 

咱们采用索引扫描的方式能够避免显式的排序操做。

咱们将UNION ALL改为UNION,该操做将会对两个数据集进行去重操做。

--新建查询,这里必定要加上一个显示的Order by才能出现合并链接去重
SELECT ContactName FROM NewEmployees
UNION 
SELECT ContactName FROM Customers
ORDER BY ContactName

这里咱们知道UNION操做会对结果进行去重操做,上面应用了流聚合操做,流聚合通常应用于分组操做中,固然这里用它进行了分组去重。

 

在咱们实际的应用环境中,最经常使用的方式仍是合并链接,可是有一种状况最适合哈希链接,那就是一个小表和大表进行联合操做,尤为适合哪一种大表中存在大量重复值的状况下。

哈希算法真是个好东西!

 

参考文献

结语

此篇文章先到此吧,简短一点,便于理解掌握,本篇主要介绍了查询计划中的联合操做运算符,下一篇咱们分析SQL Server中的并行运算,在多核超线程云集的今天,来看SQL Server如何利用并行运算来最大化的利用现有硬件资源提高性能,有兴趣可提早关注,关于SQL Server性能调优的内容涉及面很广,后续文章中依次展开分析。

 

SQL Server这个软件一旦深刻进去,你会发现它真的很是深,基本能够用深不见底来描述,若是想研究里面的性能调优这块,能够关注本系列内容,咱们一块儿研究!

并且到如今还有不少人对SQL Server这套产品有误解,或者说观点有待纠正,之前就遇到过客户直接当我面大谈神马SQL Server导入数据一多就宕机了....

神马SQL Server只能作小数据量的应用...神马不如Oracle云云....!!!

还有一部分童鞋单纯的认为SQL Server是小儿科,没啥技术含量...简单的很....

关于这些观点,我不想吐槽啥,我只想让那些真正了解SQL Server的朋友一块儿来为SQL Server证实点什么。

 

文章最后给出上一篇的链接

SQL Server调优系列基础篇

SQL Server调优系列基础篇(经常使用运算符总结)

 

若是您看了本篇博客,以为对您有所收获,请不要吝啬您的“推荐”。

相关文章
相关标签/搜索