# MATERIAL MATERIAL 算子用于物化下层算子输出的数据。 OceanBase 数据库以流式数据执行计划,但有时算子需要等待下层算子输出所有数据后才能够开始执行,所以需要在下方添加一个 MATERIAL 算子物化所有的数据。或者在子计划需要重复执行的时候,使用 MATERIAL 算子可以避免重复执行。 如下示例中,t1 表与 t2 表执行 NESTED LOOP JOIN 运算时,右表需要重复扫描,可以在右表有一个 MATERIAL 算子,保存 t2 表的所有数据。 ~~~ 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) ~~~ 上述示例中,执行计划展示中 2 号算子 MATERIAL 的功能是保存 t2 表的数据,以避免每次联接都从磁盘扫描 t2 表的数据。执行计划展示中的 outputs & filters 详细展示了 MATERIAL 算子的输出信息如下: <table data-tag="table" id="table-my8-tkf-01j" class="table"><colgroup width="194" span="1" data-tag="col" id="col-ds1-m09-j7t" colwidth="1*" colnum="1" colname="col1" style="width:50%" class="col"></colgroup><colgroup width="557" span="1" data-tag="col" id="col-20k-5qd-noh" colwidth="1*" colnum="2" colname="col2" style="width:50%" class="col"></colgroup><thead id="thead-9ot-q7b-cv6" class="thead"><tr id="tr-xib-am2-uqv"><th id="td-nzy-wdj-3q6"><p id="p-a19-l2d-kp3"><b>信息名称</b></p></th><th id="td-u6b-fik-a21"><p id="p-hlp-dj4-zsf"><b>含义</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-2jl-o16-rok" class="tbody"><tr data-tag="tr" id="tr-azb-86p-2fp" class="tr"><td data-tag="td" id="td-11z-wv9-zha" class="td"><p id="p-cth-66f-uma">output</p></td><td data-tag="td" id="td-k8e-upr-yet" class="td"><p id="p-9cc-smh-e38">该算子输出的表达式。</p><p id="p-e99-a9u-ury">其中 rownum() 表示 ROWNUM 对应的表达式。</p></td></tr><tr data-tag="tr" id="tr-e2f-uqi-118" class="tr"><td data-tag="td" id="td-vk2-mlb-8ik" class="td"><p id="p-n05-hsm-yud">filter</p></td><td data-tag="td" id="td-276-w0r-fbx" class="td"><p data-tag="p" id="p-2c4-mp5-0md" class="p">该算子上的过滤条件。</p><p data-tag="p" id="p-i7v-v4w-14p" class="p">由于示例中 MATERIAL 算子没有设置 filter,所以为 nil。</p></td></tr></tbody></table>