当前位置: 首页 > news >正文

上饶金河湾做网站/浙江网络推广

上饶金河湾做网站,浙江网络推广,怎么查询一个网站有没有做竞价,视频直播系统原文:SQL Server里Grouping Sets的威力在SQL Server里,你有没有想进行跨越多个列/纬度的聚集操作,不使用SSAS许可(SQL Server分析服务)。我不是说在生产里使用开发版,也不是说安装盗版SQL Server。 不可能的任务&#…
原文: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,如果你能在你的数据库里使用这个功能可以在此留言,非常感谢!

感谢关注!

http://www.jmfq.cn/news/5268277.html

相关文章:

  • 侵权网站怎么做/制作一个网站步骤
  • 网站被人做跳转改如何举报/广告模板
  • 网站制作的流程是什么/四川seo关键词工具
  • wordpress模版哪个好/长春网站优化平台
  • 私人网站制作/站长统计app下载免费
  • 广东哪有做网赌网站/网站关键词优化排名
  • 如何建立视频号/关键词优化多少钱
  • 中山网站建设价格/seo排名的职位
  • asp.net 4.0网站开发 下载/百度电脑版网页版
  • 厦门集团网站建设/长沙线上引流公司
  • 建门户网站需要多少钱/系统优化软件十大排名
  • 网站代码seo优化/国产十大erp软件
  • 哪个网站做设计可以挣钱/俄罗斯搜索引擎yandex推广
  • 电商网站建设与管理/aso搜索优化
  • 机械设备网站/公司企业网站模板
  • 怎么把网站加入黑名单/百度上怎么免费开店
  • 口碑好的东莞网站建设/百度指数指的是什么
  • 小型网站建设公司/整站优化服务
  • 广东平台网站建设找哪家/广州seo站内优化
  • web程序设计网站开发工具/制作网站费用
  • 用win2008做网站/今日国内重大新闻事件
  • wordpress电影模板下载/如何将网站的关键词排名优化
  • iis6 网站无法访问/公司网站
  • 烟台做网站的公司/游戏推广员好做吗
  • wordpress模板 更换/seo刷关键词排名免费
  • 石家庄市最新公告/苏州整站优化
  • 吉林seo基础知识/上首页seo
  • 网站建设费用:做个网站要多少钱?/影视剪辑培训机构排名
  • 自己做网站能宣传自己的产品吗/网络推广员为什么做不长
  • 北京建设网站的公司兴田德润优惠/seo 优化顾问