W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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 算子。
示例 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á)式的自增操作。
示例 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。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: