
# Materialize
#### 算子说明
Materialize算子用于缓存子节点返回的结果，对子查询结果进行保存。对于需要重复多次扫描的子节点（特别是扫描结果每次都相同时）可以减少执行代价。
#### 典型场景
- 当查询语句涉及子查询，需要多次查询同一批数据时，优化器会选择Materialize算子来缓存子查询的结果，从而大大减少扫描的执行时间。子查询常存在于关键字包括IN、ANY、ALL、EXISTS等子句中。
- 连接操作选择Nest Loop作为连接算子。
 
#### 示例
**示例：**带ALL的子查询。
```
--数据准备。 
gaussdb=# CREATE TABLE student(id integer, class_id integer, grade number); 
CREATE TABLE 
gaussdb=# CREATE TABLE class_table(class_id integer); 
CREATE TABLE 
gaussdb=# INSERT INTO student VALUES(generate_series(1,50), 1, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(51,100), 2, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(101,150), 3, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO student VALUES(generate_series(151,200), 3, floor(100 * random())); 
INSERT 0 50 
gaussdb=# INSERT INTO class_table VALUES(1),(2),(3),(4); 
INSERT 0 4
--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM student WHERE class_id >= all (SELECT class_id FROM class_table); 
                                 QUERY PLAN                                   
----------------------------------------------------------------------------- 
 Seq Scan on student  (cost=0.00..5206.50 rows=100 width=12) 
   Filter: (SubPlan 1) 
   SubPlan 1 
     ->  Materialize  (cost=0.00..46.03 rows=2402 width=4) 
           ->  Seq Scan on class_table  (cost=0.00..34.02 rows=2402 width=4) 
(5 rows) 
--删除。
gaussdb=# DROP TABLE IF EXISTS student,class_table;
```
上述示例中，Materialize算子输出信息如下所示。
| 信息名称        | 含义    |
|:---|:---|
| Materialize | 算子名称。 |
| Seq Scan    | 算子名称。 |
   
示例：连接操作选择Nest Loop作为连接算子。
```
--数据准备。 
gaussdb=# CREATE TABLE employee(id int, deptid int); 
CREATE TABLE 
gaussdb=# INSERT INTO employee VALUES(1, 1), (2,1),(3,2),(4, 1), (5,2); 
INSERT 0 5 
gaussdb=# CREATE TABLE manager(id int, deptid int); 
CREATE TABLE 
gaussdb=# INSERT INTO manager VALUES(1,1), (2,2),(3,1),(4,2); 
INSERT 0 4
--执行结果。 
gaussdb=# EXPLAIN SELECT * FROM employee e JOIN manager m ON e.deptid < m.deptid; 
                               QUERY PLAN                                 
------------------------------------------------------------------------- 
 Nested Loop  (cost=0.00..69341.37 rows=1539400 width=16) 
   Join Filter: (e.deptid < m.deptid) 
   ->  Seq Scan on employee e  (cost=0.00..31.49 rows=2149 width=8) 
   ->  Materialize  (cost=0.00..42.23 rows=2149 width=8) 
         ->  Seq Scan on manager m  (cost=0.00..31.49 rows=2149 width=8) 
(5 rows)
--删除。
gaussdb=# DROP TABLE employee,manager;
```
