OceanBase COUNT

2021-06-29 16:52 更新

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

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

正常分配 COUNT 算子的場景

示例 1:含有 ROWNUM 的 SQL 查詢正常分配 COUNT 算子場景。

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í)行計劃展示中的 outputs & filters 詳細(xì)展示了 COUNT 算子的輸出信息如下:

信息名稱

含義

output

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

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

filter

該算子上的過濾條件。

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

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

不分配 COUNT 算子的場景

示例 2:含有 rownum 的 SQL 改寫為 LIMIT 后,不分配 COUNT 算子的場景。

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號