2.2 参数配置
2.2.1 集群表名、字段名支持中文
问题现象
如何设置集群表名、字段名使其支持中文?
处理方法
从 862 版本开始集群表名字段名支持中文字符。需要打开参数
gcluster_extend_ident 。参数 gcluster_extend_ident 是用来控制集群是否可以创建表
名字段含有中文、特殊字符的参数。
方法 1
修改配置文件加入 gcluster_extend_ident = 1 。此种方法需要重启集群服务生效。
方法 2
在不重启的情况下 set global gcluster_extend_ident = 1 开启,创建带有中文标识的
库表,提示成功。
示例
打开 gcluster_extend_ident 参数:
gbase> set global gcluster_extend_ident=1;
Query OK, 0 rows affected (Elapsed: 00:00:00.01)
gbase> \q
Bye
suse103:~ # gccli guo
GBase client 8.6.2.18-R2.82869. Copyright (c) 2004-2017, GBase. All
Rights Reserved.
gbase> create table 表 ( 列 1 int, 列 2 varchar(10));
Query OK, 0 rows affected (Elapsed: 00:00:01.10)
gbase> insert into 表 values(1,'a 啊 ');
Query OK, 1 row affected (Elapsed: 00:00:00.03)
gbase> select * from 表 ;
+------+------+
| 列 1 | 列 2 |
+------+------+
| 1 | a 啊 |
+------+------+
1 row in set (Elapsed: 00:00:00.02)
2.2.2 rollup 、 cube 性能优化参数
_t_gcluster_group_by_ext_optimization
问题现象
rollup 、 cube 性能优化参数 _t_gcluster_group_by_ext_optimization 。
处理方法
设置参数 _t_gcluster_group_by_ext_optimization=1 后,可以优化 group by
rollup/cube/grouping sets 的执行计划。
注意
该优化有一定的限制,投影列中的分组列是函数时,优化不生效。
select func(a),b,count(*) from t group by rollup(a,b) ;通过改写 sql 的方式
可以规避当前优化限制。
select func(a),b,count(*) from t group by rollup(a,b);
改成
select fun(a),cnt from (
select a,b,count(*) as cnt from t group by rollup(a,b)
) tmp;
8.6.2_build22-R1 版本之后支持。
2.2.3 支持 insert into select from dual 功能的参数
问题现象
支持 insert into ... select ... from dual 功能的参数。
处理方法
参数 _t_gcluster_use_new_dual ,控制 gcluster 是否使用 dual 表的新的实现方式,新
的实现方式支持 insert into ... select ... from dual 等功能。
取值范围: 0 、 1 ;
默认值 0 ;
0: 使用旧的实现方式,不支持 insert into ... select ... from dual 等功能;
1 :使用新的实现方式,支持 insert into ... select ... from dual 等功能;
作用域: session , global 。
2.2.4 参数 one-pass hash group 的适用场景与算法选择
问题现象
参数 one-pass hash group 的适用场景。
处理方法
one-pass hash group 适用于源表行数较多(相对于 group buffer ),且 group by 列
中不同值占比较多的情况。当前实现中包含三种划分方式: RR 、原始 hash 、 one-p
ass hash ,它们的评估原则如下:
采样得到的 DistinctRatio < 10 (不同值占比小于 10% )时,使用 RR 划分(需
要二次聚集),否则使用 hash 划分。预期第一次聚集的结果集比较小,二次
聚集代价较低。
根据源表的行数和 group buffer 的大小,确定使用原始的 hash 划分,还是 one
pass hash 划分:
1. 当 group buffer 能够容纳源表数据的 50% 时,使用原始的 hash 划分。这时
会将数据分为 dop 份,每个线程一份,预期各线程进行聚集时不会发生多
趟;
2. 否则使用 one-pass hash 划分,这时会将数据分为(原始数据行数 / 子线
程哈希表能够容纳的行数 * 4 )个文件分片。(乘以 4 是为了防止一个文件
分片聚集时发生多趟)。
说明
如果数据量相对于 group buffer 较大,而采样结果显示不同值较多,就会使用 one-pass has
h 划分。
参数 one-pass hash group 的算法选择。
回答
针对特定的数据,以下两个原因可能导致算法选择上不是最优:
数据量大时,采样结果不准确;
选择原始 hash group 或 one-pass hash group 时,只参考了数据量,没有考虑数
据特征。
2.2.5 控制相关子查询条件中 Or 个数参数
_gbase_or_recursion_depth
问题现象
控制相关子查询中嵌套条件 Or 的最大个数参数 _gbase_or_recursion_depth 。
处理方法
参数 _gbase_or_recursion_depth 是 gnode session 级参数,默认值为 10 ,最小值
为 0 (不限制),最大值为 ULONG 类型上限;
增加原因:相关子查询中 Or 递归计算空间复杂度与 Or 个数 n 成指数关系: 3
× (2 的 n 次方 ) - 2 。当相关子查询 Or 个数较多时(一般地, n >= 14 ),使
用内存过多,极易超出系统内存大小而被系统 kill 掉;
参数说明:此参数为 gnode session 级,控制相关子查询中 Or 算子嵌套条件递
归计算的最大深度(即嵌套条件 Or 的最大个数),防止占用内存过多。 0 表
示不限制, >0 则指定最大递归深度;
超过设定值时, GNode 提示以下错误信息:
ERROR 1739 (HY000): (GBA-01EX-0006) Express out of resources error:OR operation recursion
depth overrun. Max depth: 10”
2.2.6 rpad 、 lpad 函数使用限制
问题现象
rpad 、 lpad 函数使用限制。
处理方法
语法:
RPAD(str,len,padstr)
LPAD(str,len,padstr)
用法:
用字符串 padstr 对 str 进行右 / 左边填补,直至它的长度达到 [len] 个字符长度,然后
返回补空格后的字符串 str 。
说明
目前第二个传入参数 [len] 只支持小于等于 21845 的正整数和 length() 函数,如以下计
算方式:
select rpad(substr(' 天津南大通用 ',0,2),6 ,'*') from test.tmp_0221_wxt_3 a;
select rpad(substr(' 天津南大通用 ',0,2),8-2 ,'*') from test.tmp_0221_wxt_3 a;
select rpad(substr(' 天 津 南 大 通 用 ',0,2),length(' 天津南大通用 ') ,'*') from
test.tmp_0221_wxt_3 a;
第二个传入参数 [len] 不支持 length() 以外的其他函数以及 length() 函数的计算,如以
下方式不支持:
select rpad(substr(' 天津南大通用 ',0,2),length(' 天津南大通用 ') - 1 ,'*') from
test.tmp_0221_wxt_3 a;
select rpad(substr(' 天津南大通用 ',0,2),char_length(' 天津南大通用 ') ,'*') from
test.tmp_0221_wxt_3 a;
2.2.7 存储过程递归调用及 max_sp_recursion_depth 参
数配置
问题现象
存储过程递归调用及 max_sp_recursion_depth 参数配置。
处理方法
存储过程递归调用的时候会引起报错。
示例
drop procedure if exists pro_test_1;
delimiter |
create procedure pro_test_1(lvl int)
begin
select '1';
set lvl=lvl-1;
if lvl>=0 then
call pro_test_1(lvl);
end if;
end |
delimiter ;
call pro_test_1(2017);
会产生以下报错信息:
错误: {STATEMENT: call pro_test_1(2017)
INSTRUCTION: call pro_test_1(lvl) [4]}
Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for
routine pro_test_1
从字面意思上来看,是超过递归调用的最大深度,可以通过设置集群层的
max_sp_recursion_depth 参数解决该问题。
处理方法
set max_sp_recursion_depth =3000;
call pro_test_1(2017);
执行成功。
max_sp_recursion_depth 参数范围是 [0~255] ,该值设置超出 255 后会报错;
当递归层数参数 max_sp_recursion_depth 设置为 255 的情况下,需要相应的调大
gcluster 层的 thread_stack 参数(测试环境调整为 2M ),然后重启 gclusterd ;否则可
能会栈溢出从而引起 gclusterd 的宕机。
2.2.8 控制 dblink 拉表生成方式
dblink_generate_interim_table_policy
问题现象
控制 dblibk 在拉表过程中,生成目标临时表的方式的参数 dblink_generate_interim
_table_policy 。
处理方法
_t_gcluster_dblink_generate_interim_table_policy 作用域为 global session, 级,取值
范围: 0 、 1 ,默认值: 1
说明
用于控制针对集群计划 dblink 拉表步骤,目标临时表的结构生成方式:
•
0 :使用自动评估方式,由投影表达式结果的数据类型确定;
•
1 :请求网关使用 create...select ...limit 0 方式获取临时表的结构。
相对自动评估方式,临时表的列的数据类型评估更准确。
————————————————
版权声明:本文为CSDN博主「m0_49291452」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_49291452/article/details/121954640
GBase 8a MPP使用时 数据库基础问题之二
最新推荐文章于 2022-05-17 14:27:36 发布