新聞中心
GROUP BY 算子主要用于在 SQL 中進(jìn)行分組聚合計(jì)算操作。

創(chuàng)新互聯(lián)長(zhǎng)期為近千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為武陵企業(yè)提供專業(yè)的成都網(wǎng)站制作、做網(wǎng)站,武陵網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
用于對(duì)數(shù)據(jù)進(jìn)行分組的算法有 HASH 算法和 MERGE 算法,因此根據(jù)算法可以將 GROUP BY 算子分為兩種:HASH GROUP BY 和 MERGE GROUP BY。執(zhí)行計(jì)劃生成時(shí)根據(jù) SQL 優(yōu)化器對(duì)于兩種算子的代價(jià)評(píng)估,來(lái)選擇使用哪種 GROUP BY 算子。
對(duì)于普通的聚合函數(shù)(SUM/MAX/MIN/AVG/COUNT/STDDEV)也是通過(guò)分配 GROUP BY 算子來(lái)完成,而對(duì)于只有聚合函數(shù)而不含有 GROUP BY 的 SQL,分配的是 SCALAR GROUP BY 算子,因此 GROUP BY 算子又可以分為三種:SCALAR GROUP BY、HASH GROUP BY 和 MERGE GROUP BY。
SCALAR GROUP BY
示例 1:含 SCALAR GROUP BY 算子的執(zhí)行計(jì)劃
obclient>CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected (0.12 sec)
obclient>INSERT INTO t1 VALUES(1, 1);
Query OK, 1 rows affected (0.12 sec)
obclient>INSERT INTO t1 VALUES(2, 2);
Query OK, 1 rows affected (0.12 sec)
obclient>INSERT INTO t1 VALUES(3, 3);
Query OK, 1 rows affected (0.12 sec)
Q1:
obclient> EXPLAIN SELECT SUM(c1) FROM t1\G;
*************************** 1. row ***************************
Query Plan:
| ========================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
----------------------------------------
|0 |SCALAR GROUP BY| |1 |37 |
|1 | TABLE SCAN |T1 |3 |37 |
========================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_SUM(T1.C1)]), filter(nil),
group(nil), agg_func([T_FUN_SUM(T1.C1)])
1 - output([T1.C1]), filter(nil),
access([T1.C1]), partitions(p0)
上述示例中,Q1 查詢的執(zhí)行計(jì)劃展示中的 outputs & filters 中詳細(xì)列出了 SCALAR GROUP BY 算子的輸出信息如下:
|
信息名稱 |
含義 |
|---|---|
output | 該算子輸出的表達(dá)式。 |
filter | 該算子上的過(guò)濾條件。 由于示例中 SCALAR GROUP BY 算子未設(shè)置 filter,所以為 nil。 |
group | 需要進(jìn)行分組的列。 例如,Q1 查詢中是 SCALAR GROUP BY 算子,所以為 nil。 |
agg_func | 所涉及的聚合函數(shù)。 例如,Q1 查詢是計(jì)算表 t1 的 c1 列數(shù)據(jù)之和,因此為 |
HASH GROUP BY
示例 2:含 HASH GROUP BY 算子的執(zhí)行計(jì)劃
Q2:
obclient>EXPLAIN SELECT SUM(c2) FROM t1 GROUP BY c1 HAVING SUM(c2) > 2\G;
*************************** 1. row ***************************
Query Plan:
| ======================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
--------------------------------------
|0 |HASH GROUP BY| |1 |40 |
|1 | TABLE SCAN |T1 |3 |37 |
======================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_SUM(T1.C2)]), filter([T_FUN_SUM(T1.C2) > 2]),
group([T1.C1]), agg_func([T_FUN_SUM(T1.C2)])
1 - output([T1.C1], [T1.C2]), filter(nil),
access([T1.C1], [T1.C2]), partitions(p0)
上述示例中,Q2 查詢的執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)列出了 HASH GROUP BY 算子的輸出信息如下:
|
信息名稱 |
含義 |
|---|---|
output | 該算子輸出的表達(dá)式。 |
filter | 該算子上的過(guò)濾條件。 由于設(shè)置要求分組后的 c2 列求和大于 2,因此為 |
group | 需要進(jìn)行分組的列。 例如,Q2 查詢是 HASH GROUP BY 算子,所以為 nil。 |
agg_func | 所涉及的聚合函數(shù)。 例如,Q2 查詢中計(jì)算表 t1 的 c1 列之和,因此為 |
說(shuō)明
HASH GROUP BY 算子將會(huì)保證在執(zhí)行時(shí)采用 HASH 算法進(jìn)行分組。
MERGE GROUP BY
示例 3:含 MERGE GROUP BY 算子的執(zhí)行計(jì)劃
Q3:
obclient>EXPLAIN SELECT /*+NO_USE_HASH_AGGREGATION*/SUM(c2) FROM
t1 GROUP BY c1 HAVING SUM(c2) > 2\G;
*************************** 1. row ***************************
Query Plan:
| =======================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
---------------------------------------
|0 |MERGE GROUP BY| |1 |45 |
|1 | SORT | |3 |44 |
|2 | TABLE SCAN |T1 |3 |37 |
=======================================
Outputs & filters:
-------------------------------------
0 - output([T_FUN_SUM(T1.C2)]), filter([T_FUN_SUM(T1.C2) > 2]),
group([T1.C1]), agg_func([T_FUN_SUM(T1.C2)])
1 - output([T1.C1], [T1.C2]), filter(nil), sort_keys([T1.C1, ASC])
2 - output([T1.C1], [T1.C2]), filter(nil),
access([T1.C1], [T1.C2]), partitions(p0)上述示例中,Q3 查詢的執(zhí)行計(jì)劃展示中的 outputs & filters 中詳細(xì)列出了 MERGE GROUP BY 算子的信息,可以看出相同的 SQL 生成執(zhí)行計(jì)劃時(shí)選擇了 MERGE GROUP BY 算子,其算子基本信息都是相同的,最大的區(qū)別是在執(zhí)行的時(shí)候選擇的分組算法不一樣。同時(shí),這里的 2 號(hào)算子 TABLE SCAN 返回的結(jié)果是一個(gè)無(wú)序結(jié)果,而 GROUP BY 算法采用的是 MERGE GROUP BY,因此必須分配一個(gè) SORT 算子。
注意
NO_USE_HASH_AGGREGATION 和 USE_HASH_AGGREGATION 的 HINT 可以用于控制 GROUP BY 算子選擇何種算法進(jìn)行分組。
網(wǎng)站名稱:創(chuàng)新互聯(lián)OceanBase教程:OceanBaseGROUPBY
新聞來(lái)源:http://fisionsoft.com.cn/article/dpgohsg.html


咨詢
建站咨詢
