日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發(fā)布時(shí)間:2025/3/13 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server调优系列基础篇(联合运算符总结) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

上兩篇文章我們介紹了查看查詢計(jì)劃的方式,以及一些常用的連接運(yùn)算符的優(yōu)化技巧,本篇我們總結(jié)聯(lián)合運(yùn)算符的使用方式和優(yōu)化技巧。

廢話少說,直接進(jìn)入本篇的主題。

技術(shù)準(zhǔn)備

基于SQL Server2008R2版本,利用微軟的一個(gè)更簡潔的案例庫(Northwind)進(jìn)行解析。

一、聯(lián)合運(yùn)算符

所謂的聯(lián)合運(yùn)算符,其實(shí)應(yīng)用最多的就兩種:UNION ALL和UNION。

這兩個(gè)運(yùn)算符用法很簡單,前者是將兩個(gè)數(shù)據(jù)集結(jié)果合并,后者則是合并后進(jìn)行去重操作,如果有過寫T-SQL語句的碼農(nóng)都不會(huì)陌生。

我們來分析下這兩個(gè)運(yùn)算符在執(zhí)行計(jì)劃中的顯示,舉個(gè)例子

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

就是上面這個(gè)圖標(biāo)了,這就是UNION ALL聯(lián)合運(yùn)算符的圖標(biāo)。

這個(gè)聯(lián)合運(yùn)算符很簡單的操作,將兩個(gè)數(shù)據(jù)集合掃描完通過聯(lián)合將結(jié)果匯總。

我們來看一下UNION 這個(gè)運(yùn)算符,例子如下

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

我們可以看到,UNION 運(yùn)算符是在串聯(lián)運(yùn)算符之后發(fā)生了一個(gè)Distinct Sort排序操作,經(jīng)過這個(gè)操作會(huì)將結(jié)果集合中的重復(fù)值去掉。

我們一直強(qiáng)調(diào):大數(shù)據(jù)表的排序是一個(gè)非常耗資源的動(dòng)作!

所以,到這里我們已經(jīng)找到了可優(yōu)化的選項(xiàng),去掉排序,或者更改排序方式。

替換掉Distinct Sort排序操作的方式就是哈序聚合。Distinct Sort排序操作需要的內(nèi)存和去除重復(fù)之前數(shù)據(jù)集合的數(shù)據(jù)量成正比,而哈希聚合需要的內(nèi)存則是和去除重復(fù)之后的結(jié)果集成正比!

所以如果數(shù)據(jù)行中重復(fù)值很多,那么相比而言通過哈希聚合所消耗的內(nèi)存會(huì)少。

我們來舉個(gè)例子

select ShipCountry from Orders UNION SELECT ShipCountry FROM Orders

這個(gè)例子其實(shí)沒啥用處,這里就是為了演示,我們來看一下結(jié)果

我們知道,這張表里這個(gè)ShipCountry是存在大面積重復(fù)值的,所以采用了哈希匹配來去重操作是最優(yōu)的方式。

其實(shí),相比哈希匹配連接還有一種更輕量級(jí)的去重的連接方式:合并連接

上一篇我已經(jīng)分析了這個(gè)連接方法,用于兩個(gè)數(shù)據(jù)集的連接方式,這里其實(shí)類似,應(yīng)用前都必須先將原結(jié)果集合排序!

我們知道優(yōu)化的方式可以采用建立索引來提高排序速度。

我們來重現(xiàn)這種去重方式,我們新建一個(gè)表,然后建立索引,代碼如下

--新建表 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 --新建查詢,這里一定要加上一個(gè)顯示的Order by才能出現(xiàn)合并連接去重 SELECT ContactName FROM NewEmployees UNION ALL SELECT ContactName FROM Customers ORDER BY ContactName

?

我們采用索引掃描的方式可以避免顯式的排序操作。

我們將UNION ALL改成UNION,該操作將會(huì)對(duì)兩個(gè)數(shù)據(jù)集進(jìn)行去重操作。

--新建查詢,這里一定要加上一個(gè)顯示的Order by才能出現(xiàn)合并連接去重 SELECT ContactName FROM NewEmployees UNION SELECT ContactName FROM Customers ORDER BY ContactName

這里我們知道UNION操作會(huì)對(duì)結(jié)果進(jìn)行去重操作,上面應(yīng)用了流聚合操作,流聚合一般應(yīng)用于分組操作中,當(dāng)然這里用它進(jìn)行了分組去重。

?

在我們實(shí)際的應(yīng)用環(huán)境中,最常用的方式還是合并連接,但是有一種情況最適合哈希連接,那就是一個(gè)小表和大表進(jìn)行聯(lián)合操作,尤其適合哪種大表中存在大量重復(fù)值的情況下。

哈希算法真是個(gè)好東西!

?

參考文獻(xiàn)

  • 微軟聯(lián)機(jī)叢書邏輯運(yùn)算符和物理運(yùn)算符引用
  • 參照書籍《SQL.Server.2005.技術(shù)內(nèi)幕》系列

結(jié)語

此篇文章先到此吧,簡短一點(diǎn),便于理解掌握,本篇主要介紹了查詢計(jì)劃中的聯(lián)合操作運(yùn)算符,下一篇我們分析SQL Server中的并行運(yùn)算,在多核超線程云集的今天,來看SQL Server如何利用并行運(yùn)算來最大化的利用現(xiàn)有硬件資源提升性能,有興趣可提前關(guān)注,關(guān)于SQL Server性能調(diào)優(yōu)的內(nèi)容涉及面很廣,后續(xù)文章中依次展開分析。

?

SQL Server這個(gè)軟件一旦深入進(jìn)去,你會(huì)發(fā)現(xiàn)它真的非常深,基本可以用深不見底來描述,如果想研究里面的性能調(diào)優(yōu)這塊,可以關(guān)注本系列內(nèi)容,我們一起研究!

而且到現(xiàn)在還有很多人對(duì)SQL Server這套產(chǎn)品有誤解,或者說觀點(diǎn)有待糾正,以前就遇到過客戶直接當(dāng)我面大談神馬SQL Server導(dǎo)入數(shù)據(jù)一多就宕機(jī)了....

神馬SQL Server只能做小數(shù)據(jù)量的應(yīng)用...神馬不如Oracle云云....!!!

還有一部分童鞋單純的認(rèn)為SQL Server是小兒科,沒啥技術(shù)含量...簡單的很....

關(guān)于這些觀點(diǎn),我不想吐槽啥,我只想讓那些真正了解SQL Server的朋友一起來為SQL Server證明點(diǎn)什么。

?

文章最后給出上一篇的連接

SQL Server調(diào)優(yōu)系列基礎(chǔ)篇

SQL Server調(diào)優(yōu)系列基礎(chǔ)篇(常用運(yùn)算符總結(jié))

?

如果您看了本篇博客,覺得對(duì)您有所收獲,請(qǐng)不要吝嗇您的“推薦”。

?

轉(zhuǎn)載于:https://www.cnblogs.com/zhijianliutang/p/4148540.html

總結(jié)

以上是生活随笔為你收集整理的SQL Server调优系列基础篇(联合运算符总结)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。