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