字符可以使用ascii函数获取其ascii码,但中文在utf8编码下一个中文占3个字节,无法通过ascii函数获取其ascii编码,有什么办法解决吗?

使用ord函数获取中文的ascii码,可参考SQL手册中ORD(str)函数的说明。

gbase> select ord('李');
 +------------+
 | ord('李')  |
 +------------+
 |   15113614 |
 +------------+
 1 row in set (Elapsed: 00:00:00.00)

 gbase> select char(ord('李'));
 +------------------+
 | char(ord('李')) |
 +------------------+
 | 李         |
 +------------------+
1 row in set (Elapsed: 00:00:00.00) 

删除数据能否回收rowid?

由于shrink space时,rowid回收,如果不含索引,回收的粒度是DC,即所有被delete的DC对应的rowid都能回收。
以下是做的简单测试:
(1)gnone层总行数6001215

gbase> select count(*) from lineitem;
+----------+
| count(*) |
+----------+
|  6001215 |
+----------+
1 row in set (Elapsed: 00:00:00.14)
gbase> select min(rowid),max(rowid) from lineitem;
+------------+------------+
| min(rowid) | max(rowid) |
+------------+------------+
|          0 |    6001214 |
+------------+------------+
1 row in set (Elapsed: 00:00:00.51)

(2)删除中间1个DC的数据

gbase> delete from lineitem where rowid> 65535 and rowid <2*65536;
Query OK, 65536 rows affected (Elapsed: 00:00:00.11)
gbase> alter table lineitem shrink space;
Query OK, 0 rows affected (Elapsed: 00:00:00.07)

(3)查看rowid

gbase> select min(rowid),max(rowid) from lineitem;
+------------+------------+
| min(rowid) | max(rowid) |
+------------+------------+
|          0 |    5935678 |
+------------+------------+
1 row in set (Elapsed: 00:00:00.45)

(4)插入数据后,查看rowid

gbase> insert into lineitem(l_comment) values('hello');
Query OK, 1 row affected (Elapsed: 00:00:00.40)
gbase> select rowid from lineitem where l_comment='hello';
+---------+
| rowid   |
+---------+
| 5935679 |
+---------+
1 row in set (Elapsed: 00:00:01.60)

如何限制集群sql下发的任务数目?

增加集群层参数配置限制集群sql下发的任务数目。
(1)查询当前集群已有用户及其优先级别select user, task_priority from gbase.user,明确后续参数的数值配置;
(2)gbase_use_priority_queue为优先级队列启用的开关,置1打开;
(3)将参数_gbase_priority_tasks设置为期望的相同优先级任务的最大下发数目(默认值为CPU核数,上限为64);
(4)将参数_gbase_priority_total_tasks设置为期望的全部优先级任务的最大下发数目(默认值为CPU核数的2倍,上限为128)。
注意:受控的任务语句只限于select查询及DML中的查询部分,上述参数均不支持show variables ...查询,修改后需重启集群生效。

8a中不同类型的表相互关联查询,它们的处理过程有什么不同?

hash分布表关联hash分布表且hash列相同
集群层下发sql到各节点层,执行结果汇总回发起节点。
hash分布表关联hash分布表且hash列不相同/随机分布表关联随机分布表
以关联的字段作为临时表的hash列进行重分布拉表,然后执行结果返回发起节点。
hash分布表/随机分布表关联复制表
各节点执行结果返回发起节点。
hash分布表关联随机分布表
以hash表的hash列作为关联字段时,拉随机分布表并计算。

透明网关gcluster_dblink_direct_data_exchange参数设置不同的值差异是什么?

设置为1和设置为0对SQL的支持程度是一样的,dblink的处理流程是不一样的。
说明如下:

gcluster_dblink_direct_data_exchange=1
server会发送select...into server命令给网关,网关转发该命令给源数据库,源数据库直接将数据发送到目标数据库中,数据移动不通过网关。

gcluster_dblink_direct_data_exchange=0
server会发送select 语句给网关,网关会在源数据库上执行该语句,将获取到的结果集insert到目标数据中。
在insert操作时,网关支持两种方式,具体如下:

  • load.data.type=1时,使用JDBC的PreparedStatement执行单条批量insert,该方式的优点是包含特殊字符的数据也可insert,缺点是速度较慢。
  • load.data.type=0时,使用`insert
    ...values(),(),()`形式一次性insert多条数据,该方式的优点是insert速度较单条批量insert速度快,缺点是在拼字符串时无法处理特殊字符。