一、相关分析

通常当聚合率和数据量没有大于一定程度时,对于不涉及Rollup、Cube、Grouping_Sets这三种操作的聚合很少出现GC问题。对于Rollup、Cube、Grouping_Sets操作可采用如下优化方法避免GC。

1、Rollup / Cube / Grouping_Sets时,某些场景下,如果多维度的字段比较多,内存或者GC会造成性能问题。特别的, 在实现这三种操作 时, 记录数会出现倍数的膨胀, 调优的时候请务必关注 GC 情况。 如果 GC性能情况表现不加, 建议用手动改动的方式调优, 通常是把这三种操作等价的用 UNION 多个子查询 SQL 的方式实现。 对 SQL 改写相当于是对它们计算内容的同语义翻译。

1、1Rollup的改写

对它等价的拆分改写结果如下,上下两个语句的结果相同:

1、2Cube改写

可以看出前三个的Union块的结果等同于一个Cube,所以还可以改写为

1、3Grouping Sets的改写

对它等价的拆分改写结果如下,上下两个语句的结果相同:

总结:可以按照以上所示的对三种操作的改写形式对语句展开优化,尽可能的减少因内存和GC引发的性能问题。但是,一般情况下,如果GC问题不是特别严重,就不用改写,否则会导致性能更差。

二、对比Group by、Cube、Rollup

Rollup运算符生成的结果集类似于Cube运算符生成的结果集。
CUBE和Rollup之间的具体区别:
    v1、CUBE生成的结果集显示了所选列中值的所有组合的聚合
    v2、Rollup生成的结果集显示了所选列中值的某一层次结构的聚合。
 
Rollup优点:
    v1、Rollup返回单个结果集,而compute by返回多个结果集,而多个结果集会增加应用程序代码的复杂性。
    v2、Rollup可以在服务器游标中使用,而compute by则不可以。
    v3、查询优化器为Rollup生成的执行计算比为compute by生成的更为高效。
三、实例
-1、创建表
CREATE TABLE employee_part(department STRING,name STRING,salary int)
CLUSTERED BY (department) INTO 7 BUCKETS
STORED AS ORC
tblproperties('transactional'='true');
--2、入数据
insert into employee_part values('A','ZHANG',100);
insert into employee_part values('A','LI',200);
insert into employee_part values('A','WANG',300);
insert into employee_part values('A','DUAN',500);
insert into employee_part values('B','DUAN',600 );
insert into employee_part values('B','DUAN',700);
insert into employee_part values('A','ZHAO',400);
--3、Group by
SELECT department,name,sum(salary)AS sum FROM employee_part GROUP BY department,name;
--4、Rollup
SELECT department,name,sum(salary)AS sum FROM employee_part GROUP BY Rollup(department,name);
等价于
SELECT department,name,sum(salary)AS sum
FROM employee_part
GROUP BY department,name
union
SELECT department,'NULL',SUM(salary)AS sum
FROM employee_part
GROUP BY department
union
SELECT 'NULL','NULL',SUM(salary)AS sum
FROM employee_part;
--5、CUBE
SELECT department,name,sum(salary)AS sum FROM employee_part GROUP BY Cube(department,name);
等价于
SELECT department,name,sum(salary)AS sum
FROM employee_part
GROUP BY department,name
union
SELECT department,'NULL',SUM(salary)AS sum
FROM employee_part
GROUP BY department
union
SELECT 'NULL','NULL',SUM(salary)AS sum
FROM employee_part
UNION
SELECT 'NULL', name, SUM(Salary) AS sum
FROM employee_part
GROUP BY name;
等价于
SELECT department,name,sum(salary)AS sum FROM employee_part GROUP BY Rollup(department,name)
UNION
SELECT 'NULL', name, SUM(Salary) AS sum
FROM employee_part
GROUP BY name;

可以看出CUBE的结果集在Rollup结果集上多出了5行,这5行相当于在Rollup结果集上再union上以员工名字为group by 的结果。

Group by后加rollup、cube、Grouping_Sets的用法区别的更多相关文章

  1. [转]group by 后使用 rollup 子句总结

    group by 后使用 rollup 子句总结 一.如何理解group by 后带 rollup 子句所产生的效果 group by 后带 rollup 子句的功能可以理解为:先按一定的规则产生多种 ...

  2. SQL GROUP BY GROUPING SETS,ROLLUP,CUBE(需求举例)

    实现按照不同级别分组统计 关于GROUP BY 中的GROUPING SETS,ROLLUP,CUBE 从需求的角度理解会更加容易些. 需求举例: 假如一所学校只有两个系, 每个系有两个专业, 每个专 ...

  3. 【转】new对象时,类名后加括号和不加括号的区别

    请看测试代码: #include <iostream> using namespace std; // 空类 class empty { }; // 一个默认构造函数,一个自定义构造函数 ...

  4. new对象时,类名后加括号与不加括号的区别

    [1]默认构造函数 关于默认构造函数,请参见随笔<类中函数> 请看测试代码: 1 #include <iostream> 2 using namespace std; 3 4 ...

  5. Oracle分析函数 — sum, rollup, cube, grouping用法

    本文通过例子展示sum, rollup, cube, grouping的用法. //首先建score表 create table score( class  nvarchar2(20), course ...

  6. rollup&&cube

    group by 擴展 rollup&&cube --按job分組計算不同job的匯總工資   SELECT job, SUM (sal)     FROM emp GROUP BY ...

  7. GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例

    oracle group by中rollup和cube的区别: Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句.CUBE ROLLUP 是用于统计数据的. 实验 ...

  8. SQL Server2008 程序设计 汇总 GROUP BY,WITH ROLLUP,WITH CUBE,GROUPING SETS(..)

    --SQL Server2008 程序设计 汇总 GROUP BY ,WITH ROLLUP  WITH CUBE  GROUPING SET(..) /*********************** ...

  9. [转]详解Oracle高级分组函数(ROLLUP, CUBE, GROUPING SETS)

    原文地址:http://blog.csdn.net/u014558001/article/details/42387929 本文主要讲解 ROLLUP, CUBE, GROUPING SETS的主要用 ...

随机推荐

  1. Oracle批量新增数据最佳实践

    一.需求描述 现在的项目改造过程中,从国产的Gbase数据库改造为Oracle数据库,遇到一个问题有的业务操作需要批量新增数据. 这也是一个比较常规的操作,有很多地方确实需要一次性新增多条数据.Gba ...

  2. 项目实战:Qt多通道数据采集系统(通道配置、电压转换、采样频率、通道补偿值、定时采集、导出exel和图表、自动XY轴、隐藏XY轴、实时隐藏显示通道)

    需求   1.通道使能.选择.更改通道名称.设置显示颜色  2.采样率可设置(Sa/s/chj)  3.单位换算,按照给定的进行换算  4.对通道可进行设置补偿值  5.通道取消可动态显示和隐藏,并可 ...

  3. 【题解】NOI 系列题解总集

    每次做一道 NOI 系列的估计都很激动吧,对于我这种萌新来说( P1731 [NOI1999]生日蛋糕 练习剪枝技巧,关于剪枝,欢迎看我的垃圾无意义笔记 这道题是有一定难度的,需要运用各种高科技剪枝( ...

  4. webstorm实现手机预览页面

    效果:在webstorm中开发页面,复制该页面在电脑中的浏览网址,发给手机,在手机上点击链接,可以直接访问本地开发的页面.并且,电脑上修改后保存,手机上刷新即可看到效果. 步骤: 1.webstorm ...

  5. 终于不再对transition和animation,傻傻分不清楚了 --vue中使用transition和animation

    以前写页面注重在功能上,对于transition和animation是只闻其声,不见其人,对于页面动画效果心理一直痒痒的.最近做活动页面,要求页面比较酷炫,终于有机会认真了解了. transition ...

  6. Salesforce LWC学习(二十八) 复制内容到系统剪贴板(clipboard)

    本篇参考: https://developer.mozilla.org/zh-CN/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipb ...

  7. Linux下查看目录文件大小

    1.ls -lht 查看当前目录下文件的大小 2.du -sh 查看当前文件夹的大小

  8. .Net Core 学习之旅知乎版

    @[yuyue](.Net Core 学习之旅-.netCore Developer RoadMap) # .Net Core 学习之旅 随着.NET5.O 的正式推出,微软的VS大一统目的逐步成型, ...

  9. 来体验下Linux吧

    在前面的几期中我们从树莓派开始了解Linux,大家可能已经想来试一下手了.趁热打铁,本期我将介绍两种方便体验学习Linux的方法,在线体验或者安装虚拟机. 1 在线体验Linux 如果想快速的体验下L ...

  10. ssh 免密码登陆设置不成功

    记一次centos6设置免密码登陆设置不成功的解决.自己挖的坑自己填. ssh 免密码登陆设置( 正常情况下是这样的,设置成功后登陆主机是不需要密码的) [root@master .ssh]# ssh ...