暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Citus全表扫描分析

原创 chirpyli 2022-09-02
234

我们知道Citus中,建表的时候要执行分布键,表按分布键分布到不同的worker节点中,当进行全表扫描时,也因为将分布式表分布到了众多的worker节点中,所以在进行全表扫描时,它的结果集顺序是不确定的,因为每次执行的时候,CN节点汇集worke节点的数据时,worker节点到cn节点先后顺序每次都有可能不同,造成了结果集顺序的不同。这一点是需要注意的,与Postgres等非分布式数据库是不太一样的。

Greenplum也是将数据按分布键分布到不同的segments中,所以,在Greenplum中进行全表(分布式表)扫描,同样结果集的顺序会不确定,每次执行的结果顺序可能会不同。

create table dt2(a int, b int) select create_distributed_table('dt2','a'); insert into dt2 values (1,1), (4,2), (2,3); -- 第一次执行 postgres@postgres=# select * from dt2; a | b ---+--- 2 | 3 1 | 1 4 | 2 (3 rows) -- 第二次执行结果顺序与第一次不同 postgres@postgres=# select * from dt2; a | b ---+--- 1 | 1 4 | 2 2 | 3 (3 rows) -- 加上order by ,每次顺序一致 postgres@postgres=# select * from dt2 order by a; a | b ---+--- 1 | 1 2 | 3 4 | 2 (3 rows)

我们看一下其执行计划:

postgres@postgres=# explain select * from dt2; QUERY PLAN ------------------------------------------------------------------------------ Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=8) Task Count: 2 Tasks Shown: All -> Task -- worker1 节点 Node: host=127.0.0.1 port=5433 dbname=postgres -> Seq Scan on dt2_102010 dt2 (cost=0.00..32.60 rows=2260 width=8) -> Task -- worker2 节点 Node: host=127.0.0.1 port=5434 dbname=postgres -> Seq Scan on dt2_102011 dt2 (cost=0.00..32.60 rows=2260 width=8) (9 rows)

可以看到,其全表扫描的过程,是在CN节点,将任务拆分成每个worker节点可执行的任务。也就是将select * from dt2拆分成了worker1节点执行select * from dt2_102010;select * from dt2_102011;。 两个worker节点各自在本节点扫描,并将结果集汇集到CN节点。

当然不同的SQL语句,其分布式执行计划是不同的,比如select * from dt2 order by a

postgres@postgres=# explain select * from dt2 order by a; QUERY PLAN ------------------------------------------------------------------------------------ Sort (cost=8304.82..8554.82 rows=100000 width=8) Sort Key: remote_scan.a -> Custom Scan (Citus Adaptive) (cost=0.00..0.00 rows=100000 width=8) Task Count: 2 Tasks Shown: All -> Task Node: host=127.0.0.1 port=5433 dbname=postgres -> Seq Scan on dt2_102010 dt2 (cost=0.00..32.60 rows=2260 width=8) -> Task Node: host=127.0.0.1 port=5434 dbname=postgres -> Seq Scan on dt2_102011 dt2 (cost=0.00..32.60 rows=2260 width=8) (11 rows)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论