SUBPLAN SCAN 演算子は、オプティマイザーがどのビューからデータにアクセスするかを示すために使用されます。
クエリの FROM TABLE がビューの場合、実行計画に SUBPLAN SCAN 演算子が割り当てられます。SUBPLAN SCAN 演算子は TABLE SCAN 演算子と似ていますが、基表からデータを読み取るのではなく、サブノードの出力データを読み取ります。
以下の例では、Q1クエリの演算子番号1はビュー内のクエリによって生成され、演算子番号0の SUBPLAN SCAN は演算子番号1を読み取って出力します。
obclient> CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES(1,1);
Query OK, 1 rows affected
obclient> INSERT INTO t1 VALUES(2,2);
Query OK, 1 rows affected
obclient> CREATE VIEW v AS SELECT * FROM t1 LIMIT 5;
Query OK, 1 rows affected
Q1:
obclient> EXPLAIN SELECT * FROM V WHERE c1 > 0;
Query Plan:
=====================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-------------------------------------
|0 |SUBPLAN SCAN|v |1 |37 |
|1 | TABLE SCAN |t1 |2 |37 |
=====================================
Outputs & filters:
-------------------------------------
0 - output([v.c1], [v.c2]), filter([v.c1 > 0]),
access([v.c1], [v.c2])
1 - output([t1.c1], [t1.c2]), filter(nil),
access([t1.c1], [t1.c2]), partitions(p0),
limit(5), offset(nil)
上記の例では、Q1クエリの実行計画表示における outputs & filters 列に、SUBPLAN SCAN 演算子の出力情報が詳細に示されています。
| 情報名 | 意味 |
|---|---|
| output | この演算子が出力する式。 |
| filter | この演算子におけるフィルタ条件。例えば、filter([v.c1 > 0]) の v.c1 > 0 など。 |
| access | この演算子がサブノードから読み取るために使用する列名。 |
FROM TABLE がビューであり、かつクエリが特定の条件を満たす場合、ビューの結合による書き換えが可能となり、この場合実行計画には SUBPLAN SCAN は現れません。次の例のように、Q2クエリはQ1クエリと比較してフィルタ条件が減少しているため、SUBPLAN SCAN 演算子を割り当てる必要はありません。
Q2:
obclient> EXPLAIN SELECT * FROM v;
Query Plan:
===================================
|ID|OPERATOR |NAME|EST. ROWS|COST|
-----------------------------------
|0 |TABLE SCAN|t1 |2 |37 |
===================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2]), filter(nil),
access([t1.c1], [t1.c2]), partitions(p0),
limit(5), offset(nil)