回答

收藏

何时使用GROUPING SETS,CUBE和ROLLUP

技术问答 技术问答 656 人阅读 | 0 人回复 | 2023-09-14

最近了解了用于在SQL Server多组集的定义GROUPING SETS,CUBE和ROLLUP。1 E, n# c, M5 Q! K6 e# f
我想问的是我们在什么情况下使用这些功能?使用它们和优点?
0 K8 a( M3 t+ a) _9 gSELECT shipperid,YEAR(shippeddate) AS shipyear,COUNT(*) AS numordersFROM Sales.OrdersGROUP BY GROUPING SETS ( ( shipperid,YEAR(shippeddate) ),( shipperid ),( YEAR(shippeddate) ),( ) ;SELECT shipperid,YEAR(shippeddate) AS shipyear,COUNT(*) AS numordersFROM Sales.OrdersGROUP BY CUBE( shipperid,YEAR(shippeddate) );SELECT shipcountry,shipregion,shipcity,COUNT(*) AS numordersFROM Sales.OrdersGROUP BY ROLLUP( shipcountry,shipregion,shipcity );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- |! w: d! Q! E: H) q    解决方案:                                                               
4 ^: b3 j. k+ Z/ M  w1 i; i                                                                首先,对于尚未阅读这个主题的人:
( V6 `' M9 b, T2 `# d将GROUP BY与ROLLUP,CUBE和GROUPING SETS一起使用尽管如此,不要将这些分组选项视为获取结果集的一种方式。这些都是性能工具    。
6 X/ I; t$ B' L1 R: a* X! o让我们以ROLLUP以一个简单的例子为例。
) a8 [( F1 ?4 m2 o4 D+ {3 N我可以用以下查询来获取GrpCol记录计数每个值。
. E9 {: G4 o: l" p- `' [( t. DSELECT   GrpCol,count(*) AS cntFROM     dbo.MyTableGROUP BY GrpCol我可以用以下查询来总结所有记录的数量。
8 `4 _9 Z: A  a. F: p- zSELECT   NULL,count(*) AS cntFROM     dbo.MyTable而且,UNIONALL如果我使用ROLLUP如果第一个查询是通过上述两个查询编写的,结果可以与结果完全相同(这就是为什么它被放置在其中NULL的原因)。- {6 t+ ?, S5 A" A) r' w  E
事实上,把它作为两个不同的查询来执行可能更方便,因为这样我就可以结果与总结分开。我为什么要把我的最终总数和其他结果混合在一起?答案是同时使用ROLLUP句子会更有效。SQL* h" N' L5 b) B, p1 A
Server将使用执行计划一次计算所有聚合物。与之相匹配UNIONALL比较结果相同但使用效率较低的执行计划(两次扫描而不是一次扫描)的示例。7 l+ r4 i6 N: T2 b6 V" L
想象一个极端的例子,你正在处理一个巨大的数据集,每次扫描数据需要一个小时。您基本上必须每天提供关于数据的每个可能维度(切片方法)的总数。啊,哈哈!我敢打赌这些小组选项之一就是你需要的。如果将扫描结果保存在特殊的模式布局中,报告可以在一天的剩余时间内运行,而不是保存结果。9 Q1 g: k! g1 q6 [
所以我基本上是说你在从事数据仓库项目。对我们其他人来说,它主要属于干净的事情类别。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则