GaussDB(DWS) 逻辑集群复制表解密
跨逻辑集群复制表是为了满足客户公共维表跨逻辑集群同步需求。客户可以将公共维表设计为复制表,复制表的数据可以包含多个逻辑集群节点。这样其他表和这些复制表进行关联时则不需要跨DN节点数据迁移,可以有效提升查询效率。
1. 为了支持跨逻辑集群创建复制表,需要在逻辑集群下支持一种特殊的Node Group,复制表NodeGroup。为了创建这种Node Group,需要增加新语法,具体为:CREATE NODE GROUP xxx WITH (datanode1, datanode2,…) FOR REPLICATION
语法限制:
- 该语句只能在逻辑集群模式下执行,包含的DN节点需要是一个或多个逻辑集群节点且不包括弹性集群节点;
- 该语句只能由管理员用户执行;
- 一个集群中可以创建一个或多个复制表NodeGroup,允许包含相同或不同的逻辑集群节点;
- 复制表NodeGroup定义在pgxc_group中,group_kind字段为’r’;
- 创建跨逻辑集群复制表必须在建表语句的TO GROUP中指定复制表NodeGroup名字。具体为:
- CREATE TABLE xxx ( …) distribute by replication TO GROUP groupname;
- 创建的表必须是复制表,如果是其他类型表(哈希表,roundrobin表,外表) 会报错。通过配置default_storage_nodegroup为复制表NodeGroup,可以避免写TO GROUP子句。
2.理想情况下,逻辑集群中的表和复制表NodeGroup(包含该逻辑集群的DN)中的复制表进行连接查询时,应该和将复制表创建到逻辑集群中的执行计划一致。而基线版本中,由于复制表和逻辑集群表属于不同NodeGroup且DN节点不一致,大部分关联查询的执行计划会产生Stream算子。因为,需要针对这种情况改进优化器,来消除Stream算子。
3.需要说明的是,本功能优化了执行计划,仅仅为了消除跨逻辑集群复制表和逻辑集群表关联查询时的Stream算子,并不能保证生成和同一个NodeGroup内复制表和其他表关联查询完全相同的计划。另外,本次优化主要针对跨逻辑集群复制表和一个逻辑集群内多个表的关联查询,对于跨多逻辑集群查询加跨逻辑集群复制表的情况,不会进行过多优化。
如果insert的目标表和select的源表分布类型不同,比如目标表是哈希表而select表是复制表(或目标表是复制表,select表是哈希表),则不管是否属于同一NodeGroup,都需要Stream算子。这针对复制表NodeGroup也是相同的,不需要特别处理。
如果insert的目标表和select的源表都是复制表,且select中的表属于复制表NodeGroup,而目标表属于逻辑集群,而基线版本的计划需要优化,基线版本计划如下:
理想的计划如下:
4.支持跨逻辑集群复制表扩缩容:
- 当复制表NodeGroup覆盖的逻辑集群执行扩容时,复制表NodeGroup也应该同步扩容重分布。对于跨逻辑集群复制表,表定义需要创建在所有节点上,所以在逻辑集群build完所有DN,清除表的时候,不能将跨逻辑集群复制表删除掉;
- 当复制表NodeGroup覆盖的某个逻辑集群缩容时,复制表NodeGroup也需要缩容,由于其包含的都是复制表,而复制表的缩容相对简单,不需要执行任何数据重分布,只需要更新CN中的元信息即可;
- 逻辑集群删除也会引发跨逻辑集群复制表缩容,甚至引发复制表NodeGroup被删除。如果复制表NodeGroup覆盖了多个逻辑集群,其中某个逻辑集群删除时,复制表NodeGroup需要执行缩容;如果复制表NodeGroup只覆盖了一个逻辑集群,当这个逻辑集群删除时,复制表NodeGroup也需要删除;
5.性能测试效果提升:
测试模型:Tpch 列存表 ;数据量:1000x
同一个逻辑集群的性能测试:基线场景:公共维表跟事实表在同一个逻辑集群A进行查询测试; 优化场景:公共维表改为逻辑集群复制表数据在逻辑集群A事实表在逻辑集群A 整体性能提升31%;
跨逻辑集群性能测试:基线场景:公共维表在逻辑集群A,事实表在逻辑集群B; 优化场景:公共维表改为逻辑集群复制表数据落逻辑集群A逻辑集群B,事实表在逻辑集群B, 跨逻辑集群查询性能提升13.7%;
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~
- 点赞
- 收藏
- 关注作者
评论(0)