一、相关分析

通常当聚合率和数据量没有大于一定程度时,对于不涉及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. 第15.16节 PyQt(Python+Qt)入门学习:PyQt中的信号(signal)和槽(slot)机制以及Designer中的使用

    老猿Python博文目录 老猿Python博客地址 一.引言 前面一些章节其实已经在使用信号和槽了,但是作为Qt中最重要的机制也是Qt区别与其他开发平台的重要核心特性,还是非常有必要单独介绍. 二.信 ...

  2. java课堂作业--异常处理

    一. 运行结果: 二. 结果: ArrayIndexOutOfBoundsException/内层try-catch 发生ArithmeticException 三. 结果: ArrayIndexOu ...

  3. Java数据结构(十五)—— 多路查找树

    多路查找树 二叉树和B树 二叉树的问题分析 二叉树操作效率高 二叉树需要加载到内存,若二叉树的节点多存在如下问题: 问题1:构建二叉树时,需多次进行I/O操作,对与速度有影响 问题2:节点海量造成二叉 ...

  4. this.$options.data()实战之重置data

    刚刚看到这个方法学习了一下,然后想到正在开发的项目有一个需要重置data的操作,正好拿来使用一下,节省了好多代码,美滋滋...

  5. SNOI2020 部分题解

    D1T1 画图可以发现,多了一条边过后的图是串并联图.(暂时不确定) 然后我们考虑把问题变成,若生成树包含一条边\(e\),则使生成树权值乘上\(a_e\),否则乘上\(b_e\),求最终的生成树权值 ...

  6. 基于Dokcer搭建Redis集群搭建(主从集群)

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...

  7. DRF框架笔记

    序列化器类的定义格式? 继承serializers.Serializer:字段 = serializers.字段类型(选项参数) 序列化器类的基本使用? 序列化器类(instance=None, da ...

  8. Java内存模型(MESI、内存屏障、volatile和锁及final内存语义)

    JMM (Java内存模型) Java线程的实现 实现线程主要有三种方式,Java线程从JDK1.3后采用第一种方式实现: 使用内核线程实现(1:1实现) 使用用户线程实现(1:N实现) 使用用户线程 ...

  9. [日常摸鱼]Luogu2521[HAOI2011]防线修建-set维护凸包

    https://www.luogu.org/problemnew/show/2521 题意:维护一个上凸包:删点,查询周长 很容易想到把问题转换为离线:先读入全部操作,记录下最后剩下的点,倒着加点来维 ...

  10. Linux vmstat 使用说明

    摘自 https://www.thomas-krenn.com/en/wiki/Linux_Performance_Measurements_using_vmstat Linux Performanc ...