sql – 何时使用GROUPING SETS,CUBE和ROLLUP
我最近了解到有关GROUPING SETS,CUBE和ROLLUP在SQL Server中定义多个分组集.
我在问什么是在什么情况下使用这些功能?使用它们的好处和优点是什么? SELECT shipperid,YEAR(shippeddate) AS shipyear,COUNT(*) AS numorders FROM Sales.Orders GROUP BY GROUPING SETS ( ( shipperid,YEAR(shippeddate) ),( shipperid ),( YEAR(shippeddate) ),( ) ); SELECT shipperid,COUNT(*) AS numorders FROM Sales.Orders GROUP BY CUBE( shipperid,YEAR(shippeddate) ); SELECT shipcountry,shipregion,shipcity,COUNT(*) AS numorders FROM Sales.Orders GROUP BY ROLLUP( shipcountry,shipcity ); 解决方法首先,对于那些还没有阅读过这个问题的人:> Using GROUP BY with ROLLUP,CUBE,and GROUPING SETS 话虽如此,不要把这些分组选项作为获取结果集的方式.这些是性能工具. 我们以ROLLUP为例, 我可以使用以下查询来获取每个GrpCol值的记录计数. SELECT GrpCol,count(*) AS cnt FROM dbo.MyTable GROUP BY GrpCol 我可以使用以下查询来概括地“汇总”所有记录的计数. SELECT NULL,count(*) AS cnt FROM dbo.MyTable 而且,如果我用ROLLUP子句编写了第一个查询(这就是为什么我把NULL放在那里),我可以将所有上述两个查询的UNION都得到完全相同的结果. 实际上我可以更方便地执行这两个不同的查询,因为我的分组结果与我的总计分开.为什么我想让我的最终的混合权利与其余的结果?答案是,使用ROLLUP子句来组合更有效率. SQL Server将使用一个执行计划,一次计算所有聚合.将其与UNION ALL示例进行比较,该示例将提供完全相同的结果,但使用效率较低的执行计划(两个表扫描而不是一个). 想象一下极端的例子,你正在处理一个数据集如此之大,每次扫描数据需要一整个小时.您必须每天提供基本上每个可能的维度(方式来分割)数据的总计.啊哈!我打赌这些分组选项之一就是你所需要的.如果将该扫描的结果保存到特殊的模式布局中,则可以在保存的结果中的其余时间内运行报告. 所以我基本上是说你正在研究一个数据仓库项目.对于我们其他人来说,大多数属于“整洁的事情”类别. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |