OceanBase COUNT

2021-06-29 16:52 更新

COUNT 算子用于兼容 Oracle 的 ROWNUM 功能,實(shí)現(xiàn) ROWNUM 表達(dá)式的自增操作。

在一般場(chǎng)景下,當(dāng) SQL 查詢(xún)含有 ROWNUM 時(shí),SQL 優(yōu)化器就會(huì)在生成執(zhí)行計(jì)劃的時(shí)候分配一個(gè) COUNT 算子。當(dāng)然在一些情況下,SQL 優(yōu)化器會(huì)將含有 ROWNUM 的 SQL 改寫(xiě)為 LIMIT 算子,這時(shí)就不會(huì)再分配 COUNT 算子。

正常分配 COUNT 算子的場(chǎng)景

示例 1:含有 ROWNUM 的 SQL 查詢(xún)正常分配 COUNT 算子場(chǎng)景。

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(3, 3);
Query OK, 1 rows affected (0.12 sec)

obclient>INSERT INTO t1 VALUES(5, 5);
Query OK, 1 rows affected (0.12 sec)

Q1: 
obclient>EXPLAIN SELECT c1,ROWNUM FROM t1\G;
*************************** 1. row ***************************
Query Plan:
| ====================================
|ID|OPERATOR   |NAME|EST. ROWS|COST|
------------------------------------
|0 |COUNT      |    |1        |37  |
|1 | TABLE SCAN|T1  |1        |36  |
====================================

Outputs & filters: 
-------------------------------------
  0 - output([T1.C1], [rownum()]), filter(nil)
  1 - output([T1.C1]), filter(nil), 
      access([T1.C1]), partitions(p0)

obclient>SELECT c1,ROWNUM FROM t1;
+------+--------+
| C1   | ROWNUM |
+------+--------+
|    1 |      1 |
|    3 |      2 |
|    5 |      3 |
+------+--------+
3 rows in set (0.01 sec)

上述示例中,執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)展示了 COUNT 算子的輸出信息如下:

信息名稱(chēng)

含義

output

該算子輸出的表達(dá)式。

其中 rownum() 表示 ROWNUM 對(duì)應(yīng)的表達(dá)式。

filter

該算子上的過(guò)濾條件。

由于示例中 COUNT 算子沒(méi)有設(shè)置 filter,所以為 nil。

從上述執(zhí)行計(jì)劃示例的輸出結(jié)果可以發(fā)現(xiàn),ROWNUM 對(duì)應(yīng)的表達(dá)式的初始值為 1,每通過(guò)一次 COUNT 算子,COUNT 算子就會(huì)為 ROWNUM 對(duì)應(yīng)的表達(dá)式的值加上 1,實(shí)現(xiàn) ROWNUM 表達(dá)式的自增操作。

不分配 COUNT 算子的場(chǎng)景

示例 2:含有 rownum 的 SQL 改寫(xiě)為 LIMIT 后,不分配 COUNT 算子的場(chǎng)景。

Q2:
obclient>EXPLAIN SELECT 1 FROM DUAL WHERE ROWNUM < 2\G;
*************************** 1. row ***************************
Query Plan:
| ====================================
|ID|OPERATOR   |NAME|EST. ROWS|COST|
------------------------------------
|0 |LIMIT      |    |1        |1   |
|1 | EXPRESSION|    |1        |1   |
====================================

Outputs & filters: 
-------------------------------------
  0 - output([1]), filter(nil), limit(?), offset(nil)
  1 - output([1]), filter(nil)
      values({1})

從上述執(zhí)行計(jì)劃示例的輸出結(jié)果可以發(fā)現(xiàn),雖然 SQL 中含有 ROWNUM,但是經(jīng)過(guò) SQL 優(yōu)化器改寫(xiě)之后,已經(jīng)將涉及含有 ROWNUM 的表達(dá)式轉(zhuǎn)換為了等價(jià)的 LIMIT 表達(dá)式,轉(zhuǎn)換的好處在于可以做更多的優(yōu)化,詳細(xì)信息請(qǐng)參見(jiàn) LIMIT

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)