更新时间:2025-05-29 GMT+08:00
StartWith Operator
算子说明
层次查询算子,用于执行递归查询操作。层次查询的执行流程是:
- 由START WITH区域的条件选择初始的数据集,把初始的数据集设为工作集。
- 只要工作集不为空,会用工作集的数据作为输入,查询下一轮的数据,过滤条件由CONNECT BY区域指定。其中,PRIOR关键字表示当前记录。
- 把步骤2中筛选出来的数据集,设为工作集,返回第二步重复操作。
同时,数据库为每一条选出来的数据添加下述的伪列,方便用户了解数据在递归或者树状结构中的位置。可以根据CONNECT BY中的条件,建立对应的索引,来提高START WITH语句的性能。
典型场景
使用层次查询。
示例
--数据准备。 gaussdb=# DROP TABLE IF EXISTS area; gaussdb=# CREATE TABLE area (id INT,name VARCHAR(25),parent_id INT); CREATE TABLE gaussdb=# INSERT INTO area VALUES (1,'中国',NULL); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (2,'北京市',1); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (3,'朝阳区',2); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (4,'陕西省',1); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (5,'西安市',4); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (6,'雁塔区',5); INSERT 0 1 gaussdb=# INSERT INTO area VALUES (7,'未央区',5); INSERT 0 1 --执行结果。 gaussdb=# EXPLAIN SELECT level, name FROM area START WITH (id = 1) CONNECT BY PRIOR id = parent_id; QUERY PLAN ------------------------------------------------------------------------------------------ CTE Scan on tmp_reuslt (cost=294.67..295.55 rows=44 width=72) CTE tmp_reuslt -> StartWith Operator (cost=0.00..294.67 rows=44 width=76) Start With pseudo atts: array_key_1 -> Recursive Union (cost=0.00..294.67 rows=44 width=76) -> Seq Scan on area (cost=0.00..19.64 rows=4 width=76) Filter: (id = 1) -> Hash Join (cost=27.35..27.42 rows=4 width=76) Hash Cond: (tmp_reuslt.id = public.area.parent_id) -> WorkTable Scan on tmp_reuslt (cost=0.00..0.02 rows=1 width=4) -> Hash (cost=17.71..17.71 rows=771 width=76) -> Seq Scan on area (cost=0.00..17.71 rows=771 width=76) (12 rows) --删除。 gaussdb=# DROP TABLE IF EXISTS area;
上述示例中,StartWith算子输出信息如下所示。
信息名称 |
含义 |
---|---|
StartWith |
算子的名称。 |
Start With pseudo atts |
递归的关键列号。Start With pseudo atts: array_key_1表示被prior标记的条件是原表的第1列,以此列进行递归。 |
父主题: 运算符