group by cube

对group by cube而言,将会生成2的N次方组总数,这里的N是group by中的列的数目。

下面是查询语句和执行计划:
SQL> set autotrace on
SQL> select employee_id, first_name, last_name
  2  from employees
  3  where employee_id < 101
  4  group by cube(employee_id, first_name, last_name)
  5  /

EMPLOYEE_ID FIRST_NAME           LAST_NAME
----------- -------------------- -------------------------

                                 King
            Steven
            Steven               King
        100
        100                      King
        100 Steven
        100 Steven               King

已选择8行。

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=19)
   1    0   SORT (GROUP BY) (Cost=4 Card=1 Bytes=19)
   2    1     GENERATE (CUBE)
   3    2       SORT (GROUP BY) (Cost=4 Card=1 Bytes=19)
   4    3         TABLE ACCESS (FULL) OF 'EMPLOYEES' (Cost=2 Card=1 By
          tes=19)
Statistics
----------------------------------------------------------
        639  recursive calls
          0  db block gets
        167  consistent gets
         11  physical reads
          0  redo size
        636  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          8  sorts (memory)
          0  sorts (disk)
          8  rows processed

可以看到,生成了8组结果:

所有行的总和
每个last_name,包括所有employee_id和first_name。
每个first_name,包括所有employee_id和last_name。
每项employee_id,包括所有first_name和last_name
每个employee_id/first_name,last_name。
每个employee_id/ last_name,包括所有first_name。
每个first_name / last_name组合,包括所有employee_id。
每个employee_id、first_name,last_name。
可能的结果很多,可见,对于group by cube的参数,没增加一个,那么得到的结果集也将翻一番。

可以用GROUP BY GROUPING SETS来代替GROUP BY CUBE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值