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)