OceanBase MATERIAL

2021-06-29 16:40 更新

MATERIAL 算子用于物化下層算子輸出的數(shù)據(jù)。

OceanBase 數(shù)據(jù)庫(kù)以流式數(shù)據(jù)執(zhí)行計(jì)劃,但有時(shí)算子需要等待下層算子輸出所有數(shù)據(jù)后才能夠開(kāi)始執(zhí)行,所以需要在下方添加一個(gè) MATERIAL 算子物化所有的數(shù)據(jù)?;蛘咴谧佑?jì)劃需要重復(fù)執(zhí)行的時(shí)候,使用 MATERIAL 算子可以避免重復(fù)執(zhí)行。

如下示例中,t1 表與 t2 表執(zhí)行 NESTED LOOP JOIN 運(yùn)算時(shí),右表需要重復(fù)掃描,可以在右表有一個(gè) MATERIAL 算子,保存 t2 表的所有數(shù)據(jù)。

obclient>CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
Query OK, 0 rows affected (0.12 sec)

obclient>CREATE TABLE t2(c1 INT ,c2 INT ,c3 INT);
Query OK, 0 rows affected (0.12 sec)

obclient>EXPLAIN SELECT  /*+ORDERED USE_NL(T2)*/* FROM t1,t2 
         WHERE t1.c1=t2.c1\G;
*************************** 1. row ***************************
Query Plan: 
===========================================
|ID|OPERATOR        |NAME|EST. ROWS|COST  |
-------------------------------------------
|0 |NESTED-LOOP JOIN|    |2970     |277377|
|1 | TABLE SCAN     |t1  |3        |37    |
|2 | MATERIAL       |    |100000   |176342|
|3 |  TABLE SCAN    |t2  |100000   |70683 |
===========================================
Outputs & filters: 
-------------------------------------
  0 - output([t1.c1], [t1.c2], [t1.c3], [t2.c1], [t2.c2], [t2.c3]), filter(nil), 
      conds([t1.c1 = t2.c1]), nl_params_(nil)
  1 - output([t1.c1], [t1.c2], [t1.c3]), filter(nil), 
      access([t1.c1], [t1.c2], [t1.c3]), partitions(p0)
  2 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil)
  3 - output([t2.c1], [t2.c2], [t2.c3]), filter(nil), 
      access([t2.c1], [t2.c2], [t2.c3]), partitions(p0)

上述示例中,執(zhí)行計(jì)劃展示中 2 號(hào)算子 MATERIAL 的功能是保存 t2 表的數(shù)據(jù),以避免每次聯(lián)接都從磁盤掃描 t2 表的數(shù)據(jù)。執(zhí)行計(jì)劃展示中的 outputs & filters 詳細(xì)展示了 MATERIAL 算子的輸出信息如下:

信息名稱

含義

output

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

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

filter

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

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

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)