南大通用GBase 8a节点间数据传输的select into server语法介绍

Select into server是gbase 8a提供独立的语法,提供了一种方式,可以实现8a server之间的数据传输,可以在需要的时候对表中的数据在集群的各个节点上进行重新分布,以实现某些特定的操作。当目标节点为多个时,可以设置采用hash的方式将数据分组进行发送。

在集群中Select into server是一个比较重要的命令,它几乎承载了所有节点间数据传输任务。原有的select into server在多并发情况下表现较好,但该算法中的hash拆分、压缩和发送都是串行执行,使得并发较少时不能有效的利用硬件资源。而且二次物化也会造成执行过程的复杂,影响执行效率和内存使用的浪费。

随着大规模集群工作的展开,整个MPP产品将承载更大的数据量,这就对select into server功能提出了更高的性能要求。

新的select into server是对原有功能进行的一次性能优化,精简了物化的过程,而且计算任务采用并行的方式,网络部分多目标节点可以并行发送。这些改进明显提高了select into server的执行效率,对数据重分布和其他节点间数据传送的场景提供了更为有力的支持。

当前,改进后新的select into server与原有方式共存,使用全局配置参数_gbase_use_new_sis进行控制, 0采用原有方式,1采用新的优化方式

  • 参数配置

在单机配置文件中添加_gbase_use_new_sis参数

_gbase_use_new_sis = 0 (默认),表示使用原有方式,优化不工作

_gbase_use_new_sis = 1,采用优化后的select into server

  • 语法

语法与原有规定相比无变更,此处供参考。

SELECT [ … ] INTO SERVER ( … ) FROM [ …] [WHERE|GROUP| … ] ;

或者

SELECT [ … ] FROM [ …] [WHERE|GROUP| … ] INTO SERVER ( … ) ;

参数与原有相比无变更,更详细说明请参阅参考文档。

SERVER( … ):

SERVER(

  • HOST      ‘IP1,IP2,…’,    目标节点的IP地址,以字符串的方式,可以设置1个或多个目标节点,多个IP地址以逗号分隔。当目标节点为多个时,若指定了group列,将采用hash分组的方式来发送到各个节点,否则将数据发送到全部节点。
  • PORT       ‘port1,port2,…’,           目标节点的端口号,以字符串的方式,可以设置1个或多个端口号,多个端口号以逗号分隔,默认为当前节点的端口号。当设置为多个端口号时,端口号的数目与设置的目标节点数目必须相同,以对应每个目标节点。
  • USER           ‘user name’,                        连接目标节点所使用的用户名
  • PASSWORD  ‘password’,                          连接目标节点所使用的密码
  • DATABASE   ‘database name’,                  接收数据的库
  • TABLE          ‘table name’,                       接收数据的表
  • COMMENT    ‘comment’                           控制传输方式

)

COMMENT ‘ … ’:

COMMENT ‘

  • TEMP,    如果设定了该参数,目标节点接收到数据后不会持久化,重启节点后,数据会被清除;如果没有设定该参数,目标节点接收到数据后需要持久化,相当于再做一次insert into select …,需要花费更多的时间,需根据场景和业务要求来决定是否设置此参数。
  • GROUP n1 n2 …,             设置hash列,数字n1、n2等为select结果集的逻辑列号,1表示select结果集中第1列。可以设置为1个或多个hash列,不同列号之间以空格分隔。当存在多个目标节点时,会按照设定的列做hash分组发送。
  • HASH_MAP n1 n2 … nN,    设置每个hash桶中数据的去向。系统默认为65536个桶,每个桶对应一个数值,当此值为-1时,表示桶中数据不发送。n的取值为:0~目标节点个数-1,例如:之前设置的目标节点为15个,则n的取值为0~14。
  • 以hash桶数为4个举例:

将本地节点表t中a、b的数据,以a列做hash分组,将数据发送到192.168.9.220和192.168.9.221的test.tt表中:

select a, b from t into server (host '192.168.9.220,192.168.9.221', port 5012, user 'gbase', password 'gbase', database 'test', table 'tt', comment 'temp,group 1,hash_map 0 1 0 1') ;

此时hash_map中,0对应192.168.9.220,1对应192.168.9.221,此语句表示,第1个和第3个hash桶中的数据发送到192.168.9.220,第2个和第4个hash桶中的数据发送到192.168.9.221。