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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server里Grouping Sets的威力

發布時間:2025/4/5 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server里Grouping Sets的威力 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在SQL Server里,你有沒有想進行跨越多個列/緯度的聚集操作,不使用SSAS許可(SQL Server分析服務)。我不是說在生產里使用開發版,也不是說安裝盜版SQL Server。

不可能的任務?未必,因為通過SQL Server里所謂的Grouping Sets就可以。在這篇文章里我會給你概括介紹下Grouping Sets,使用它們可以實現哪類查詢,什么是它們的性能優勢。

使用Grouping Sets的聚合

假設你有個訂單表,你想進行跨多個分組的T-SQL聚集查詢。在AdventureWorks2012數據庫的Sales.SalesOrderHeader表的環境里,這些分組可以類似如下:

  • 在每列分組
  • GROUP BY SalesPersonID, YEAR(OrderDate)
  • GROUP BY CustomerID, YEAR(OrderDate)
  • GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate)

當你想用傳統T-SQL查詢進行這些各自分組時,你需要多個語句,對各個記錄集進行UNION ALL。我們來看這樣的查詢:

1 SELECT * FROM 2 ( 3 -- 1st Grouping Set 4 SELECT 5 NULL AS 'CustomerID', 6 NULL AS 'SalesPersonID', 7 NULL AS 'OrderYear', 8 SUM(TotalDue) AS 'TotalDue' 9 FROM Sales.SalesOrderHeader 10 WHERE SalesPersonID IS NOT NULL 11 12 UNION ALL 13 14 -- 2nd Grouping Set 15 SELECT 16 NULL AS 'CustomerID', 17 SalesPersonID, 18 YEAR(OrderDate) AS 'OrderYear', 19 SUM(TotalDue) AS 'TotalDue' 20 FROM Sales.SalesOrderHeader 21 WHERE SalesPersonID IS NOT NULL 22 GROUP BY SalesPersonID, YEAR(OrderDate) 23 24 UNION ALL 25 26 -- 3rd Grouping Set 27 SELECT 28 CustomerID, 29 NULL AS 'SalesPersonID', 30 YEAR(OrderDate) AS 'OrderYear', 31 SUM(TotalDue) AS 'TotalDue' 32 FROM Sales.SalesOrderHeader 33 WHERE SalesPersonID IS NOT NULL 34 GROUP BY CustomerID, YEAR(OrderDate) 35 36 UNION ALL 37 38 -- 4th Grouping Set 39 SELECT 40 CustomerID, 41 SalesPersonID, 42 YEAR(OrderDate) AS 'OrderYear', 43 SUM(TotalDue) AS 'TotalDue' 44 FROM Sales.SalesOrderHeader 45 WHERE SalesPersonID IS NOT NULL 46 GROUP BY CustomerID, SalesPersonID, YEAR(OrderDate) 47 ) AS t 48 ORDER BY CustomerID, SalesPersonID, OrderYear 49 GO

用這個T-SQL語句方法有多個缺點:

  • T-SQL語句本身很龐大,因為每個單獨分組都是一個不同查詢。
  • 每查詢1次,Sales.SalesOrderHeader表需要訪問4次。
  • 每查詢1次,你在執行計劃里會看到SQL Server進行了4次的索引查找(非聚集)(Index Seek (NonClustered)?)。

?

如果你使用自SQL Server 2008以后引入的grouping sets功能,就可以大大簡化你需要的T-SQL代碼。下面代碼展示你同樣的查詢,但這次用grouping sets實現。

1 SELECT 2 CustomerID, 3 SalesPersonID, 4 YEAR(OrderDate) AS 'OrderYear', 5 SUM(TotalDue) AS 'TotalDue' 6 FROM Sales.SalesOrderHeader 7 WHERE SalesPersonID IS NOT NULL 8 GROUP BY GROUPING SETS 9 ( 10 -- Our 4 different grouping sets 11 (CustomerID, SalesPersonID, YEAR(OrderDate)), 12 (CustomerID, YEAR(OrderDate)), 13 (SalesPersonID, YEAR(OrderDate)), 14 () 15 ) 16 GO

從代碼本身可以看到,你只在GROUP BY GROUPING SETS子句里指定需要的分組集——其它的一切都由SQL Server搞定。指定的空括號是所謂的Empty Grouping Set,是跨整個表的聚集。當你看STATISTICS IO輸出時,你會發現Sales.SalesOrderHeader只被訪問了1次!這是和剛才手工實現的巨大區別。

在執行計劃里,SQL Server使用了Table Spool運算符,它把獲得的數據臨時存儲在TempDb里。來自臨時表里創建的Worktable的數據在執行計劃的第2個分支被使用。因此對來自表的每個分組數據沒有重新掃描,這就給整個執行計劃的帶來了更好的性能。

我們再來看下執行計劃,你會發現查詢計劃包含了3個Stream Aggregate運算符(紅色,藍色,綠色高亮顯示)。這3個運算符計算各個分組集:

  • 藍色高亮的運算符計算CustomerID, SalesPersonID, YEAR(OrderDate的分組集。
  • 紅色高亮的運算符計算SalesPersonID, YEAR(OrderDate)的分組集。另外也計算每1列的分組集。
  • 綠色高亮的運算符計算CustomerID, YEAR(OrderDate)的分組集。

2個連續的Stream Aggregate運算符的背后想法是計算所謂的Super Aggregates——聚集的聚集。

小結

在今天的文章里我給你介紹了grouping sets,在SQL Server 2008后引入的增強T-SQL。如你所見grouping sets有2個大優點:簡化你的代碼,只訪問一次數據提高查詢性能。

我希望現在你已經能夠很好理解grouping sets,如果你能在你的數據庫里使用這個功能可以在此留言,非常感謝!

感謝關注!

參考文章:

https://www.sqlpassion.at/archive/2014/09/15/the-power-of-grouping-sets-in-sql-server/

總結

以上是生活随笔為你收集整理的SQL Server里Grouping Sets的威力的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 视频网站在线观看18 | 日韩午夜在线观看 | 国产5区| 国产精品av一区二区 | 免费无码国产精品 | 久久免费国产精品 | 精品人妻少妇一区二区 | 少妇人妻综合久久中文字幕 | 日韩少妇一区二区 | 66精品| 日本久久影视 | 欧美成人性生活片 | 成人三级做爰av | 久久高清 | 国产色视频一区二区三区qq号 | 五月激情综合婷婷 | 女人夜夜春| 日韩伦理一区二区三区 | 天堂av中文在线观看 | 91久久精品日日躁夜夜躁欧美 | 亚洲国产一级 | 国产一区二区不卡视频 | 污污小说在线观看 | 综合网五月 | 性视频久久 | 欧美一区二区三区在线视频 | 国产精品视频一二三区 | 妺妺窝人体色777777 | 亚洲wwww | 黄色动漫软件 | caoporm超碰| 日本三级片在线观看 | 91视频免费看片 | 肉丝袜脚交视频一区二区 | 免费在线观看av | 人成免费在线视频 | 国产精品久久久久野外 | 日本一区二区视频 | 国产黄在线观看 | 国外av在线| 国产亚洲精品aaaaaaa片 | 国产一级生活片 | 美女扒开粉嫩的尿囗给男生桶 | 欧美在线导航 | 67194av| 国产欧美激情在线观看 | 色播99| 免费在线精品视频 | 欧美日韩国产亚洲沙发 | 91免费国产 | 亚洲再线 | 欧美丰满熟妇bbb久久久 | 国产一区二区免费看 | 国产精品无码久久久久 | 亚洲色图综合网 | 致命魔术电影高清在线观看 | 少妇爽| 国产又粗又猛又爽又黄91 | 草莓视频在线观看入口w | 久久性生活 | 少妇性l交大片免潘金莲 | 伊人网免费视频 | 黄页网站在线看 | 无码人妻av一区二区三区波多野 | 精品国产一区二区三区噜噜噜 | 欧美丰满熟妇bbbbbb百度 | 看国产黄色片 | 美日韩一区二区 | 一区两区小视频 | 国产精品自拍在线观看 | 久久久精品中文字幕 | 边啃奶头边躁狠狠躁 | 久久久久久福利 | 成年人福利网站 | 一级做a爰片久久毛片潮喷 天天透天天干 | 婷婷免费 | www黄在线观看 | 黄色男人的天堂 | 精品乱子伦一区二区 | chien国产乱露脸对白 | 99精品在线视频观看 | 欧美精品中文 | 日韩综合一区二区三区 | 亚州av综合色区无码一区 | 亚洲图片小说视频 | 天天操天天摸天天干 | 福利社区一区二区 | 日本少妇裸体做爰 | 国产青草视频在线观看 | 丝袜ol美脚秘书在线播放 | 波多野结衣一区 | 亚洲精品国产成人久久av盗摄 | 青草视频在线 | 亚洲香蕉在线视频 | 午夜激情免费 | 国产精品一区二区三区久久久 | 污漫在线观看 | 天堂中文在线资源 | 妺妺窝人体色www婷婷 |