原文链接:
https://www.gbase.cn/community/post/3941
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
1.1 SQL 执行相关参数
1.1.1 Insert value 数据分布参数
gcluster_random_insert
gcluster_random_insert 参数用于控制随机分布表再执行 insert value 时,数据 分布到单机的原则。默认取值为 0,推荐配置值为 1。
取值为 0 表示 insert value 数据都落在一个节点上(当执行 insert values 语句的 节点是复合节点时则数据插入到该节点,否则插入到随机节点);
取值为 1 表示 insert value 插入数据,random 随机均匀的分布到所有节点。
1.1.2 支持 insert into select from dual 功能的参数
t_gcluster_use_new_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。
1.1.3 group by 数据重分布参数
t_gcluster_hash_redistribute_groupby_on_multiple_expression
t_gcluster_hash_redistribute_groupby_on_multiple_expression 参数用于按 照 group by 运算的所有列进行 hash 重分布,默认取值为 0 即关闭。
对于 group by 的第一个字段是常量字段或少量取值字段的 SQL,可尝试打开该参 数进行优化。
1.1.4 Join/物化结果集大小参数设置
_gbase_result_threshold
_gbase_result_threshold 参数用于限制 JOIN 结果集和物化结果集的大小,需要 在 gcluster 及 gnode 中都进行配置。默认取值较大,为 137438953472。推荐配 置为最大表行数的两倍。该参数可用于避免笛卡尔积,当笛卡尔积连接的结果集行数超过该配置值时,则报错退出。
1.1.5 结果集并行物化阈值
gbase_parallel_threshold
gbase_parallel_threshold 参数是结果集并行物化的阈值,当结果行数大于等于 gbase_parallel_threshold 参数时,进行多个线程并行物化,否则串行做物化。默认取值为 10000。
如果 SQL 在结果集物化阶段为串行且花费时间占比较大,则可以调小该配置,如 配置为 500 或更小。
对于高并发精确查询场景下,建议设置 gbase_parallel_threshold 参数取值大于 90%的结果集行数,避免多线程并行导致 CPU资源争抢严重而出现 sys cpu 占用。
1.1.6 是否允许创建 binary/varbinary 类型字段
gcluster_support_binary
gcluster_support_binary 参数默认取值为 1,表示允许评估出的目标表字段类型 为 binary/varbinary 类型,并允许创建 binary/varbinary 类型的列。当取值为 0时则不允许创建 binary/varbinary 类型的列,需要使用varchar 类型。 可根据业务需求调整该参数取值。
1.1.7 表名列名带中文字符的参数设置
gcluster_extend_ident
gcluster_extend_ident 参数用于控制是否可以创建中文表名、中文字段名、特殊 字符的字段名。默认取值为 0 即关闭。通常不推荐打开该参数。
对于有中文表名、字段名的场景,需要打开该参数。
1.1.8 group by 开窗函数优化参数
t_gcluster_group_by_ext_optimization
t_gcluster_group_by_ext_optimization 参数打开后可以将 group by rollup/cube/grouping sets 优化,将 group by rollup 等改成 union all 执行。 参数默认取值为 0 即关闭,推荐取值为 1。
但是该优化有一定的限制,投影列中的分组列是函数时,优化不生效。
如: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 func(a),cnt from (select a,b,count(*) as cnt from t group by rollup(a,b) ) tmp;
1.1.9 One-pass hash group 优化
_gbase_one_pass_hash_group
one-pass hash group 适用于源表行数较多(相对于 group buffer),且 groupby 列中不同值占比较多的情况。当前实现中包含三种划分方式:RR、原始 hash、 one-pass hash,它们的评估原则如下:
采样得到的 DistinctRatio < 10(不同值占比小于 10%)时,使用 RR 划分(需要 二次聚集),否则使用 hash 划分。预期第一次聚集的结果集比较小,二次聚集代 价较低。
根据源表的行数和 group buffer 的大小,确定使用原始的 hash 划分,还是one- pass hash 划分:当 group buffer 能够容纳源表数据的 50%时,使用原始的 hash 划分。这时会将 数据分为 dop 份,每个线程一份,预期各线程进行聚集时不会发生多趟;否则使用 one-pass hash 划分,这时会将数据分为(原始数据行数 / 子线程哈希 表能够容纳的行数 * 4)个文件分片。(乘以 4 是为了防止一个文件分片聚集时发 生多趟)。
- 说明
如果数据量相对于 group buffer 较大,而采样结果显示不同值较多,就会使用one- pass hash 划分。
针对特定的数据,以下两个原因可能导致算法选择上不是最优: 数据量大时,采样结果不准确;
选择原始 hash group 或one-pass hash group 时,只参考了数据量,没有考虑数据特征。
1.1.10 存储过程递归调用层数设置参数
max_sp_recursion_depth
max_sp_recursion_depth 参数表示存储过程允许递归调用的深度,参数范围是 [0~255],默认取值为 0。
当出现存储过程递归调用报错 “ Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine pro_test_1”时 可以通过调整 max_sp_recursion_depth 参数解决。
当业务中存在存储过程递归调用需求时 ,可根据需求调整 max_sp_recursion_depth参数,参数值设置超出[0,255]后会报错。调整参数为较大取值时,也需要相应的调大 gcluster 层的thread_stack 参数。 如:当递归层数参数 max_sp_recursion_depth 设置为 255 的情况下,调大 gcluster层的 thread_stack 参数(测试环境调整为 2M),然后重启 gclusterd;否则可 能会栈溢出从而引起 gclusterd 的宕机。
1.1.11 CTE 支持参数
t_gcluster_support_cte
t_gcluster_support_cte 参数用于控制是否支持 CTE ( common table expression)语法,即 with as 语法,该参数为 session 级参数,默认值为 0 表示 不支持,值设置为 1 时支持 CTE 语法。
1.1.12 connect by start with 递归查询参数
_gbase_connect_by_support_table_with_deleted_records
_gbase_connect_by_support_table_with_deleted_records 参 数 用 于 控 制 connect by start with 递归查询的表执行delete 数据后是否还运行执行start with 查询。默认值为 0(OFF)。
当表执行过 delete 操作后,再次执行 connect by col = prior col start with col= val 查询时,会提示错误:“CAUSE:(GBA-01EX-700) Gbase general error: Restrict: Connect by clause must be used with table not deleted ” 。 打 开 _gbase_connect_by_support_table_with_deleted_records 参数后则可正常执 行。
1.1.13 相关子查询中 or 算子递归深度限制
_gbase_or_recursion_depth
_gbase_or_recursion_depth 参数用于控制相关子查询中 or 算子嵌套条件递归计 算的最大深度(即嵌套条件 Or 的最大个数),默认取值为 10。超过设定值后报错
“Express out of resources error:OR operation recursion depth overrun. Max depth: 10”。
此参数为 gnode session 级,0 表示不限制,>0 则指定最大递归深度;
相关子查询中 Or 递归计算空间复杂度与 Or 个数 n 成指数关系:3 × (2 的 n 次 方) - 2。递归深度与系统可用内存大小有关,当相关子查询 Or 个数较多时(一般 地,n >= 14),使用内存过多,极易超出系统内存大小使 gbased进程被系统 kill 掉,造成宕机。
如:
Create table t1(L1 int,L2 int,L3 int, ,L15 int); Create table t2(L1 int,L2 int,L3 int, ,L15 int);
Select * from t1 A Where exists
(select 1 from t2 B where
(A.L1=B.L1 or A.L1 is null) And
(A.L2=B.L2 or A.L2 is null) And
......
And
(A.L15=B.L15 or A.L15 is null) 报错如下:
ERROR 1739 (HY000) :(GBA-01EX-0006)Express out of resources error:OR operation recursion depth overrun. Max depth: 10
1.1.14 in 子查询结果集的 distinct 行数限制
_gbase_in_subquery_result_threshold
_gbase_in_subquery_result_threshold 参数用于限制 in 子查询结果集的 distinct 行数。取值范围[0,1 亿],取值为 0 时表示不限制,默认取值为 1000 万。
可根据业务场景情况进行该值的调整。
1.2 dblink 参数
1.2.1 中间临时结果保留参数
gcluster_dblink_direct_data_exchange
gcluster_dblink_direct_data_exchange 参数是透明网关相关参数, 针对使用 dblink 进 行两个GBase 8a集群表数据的insert select 操 作, gcluster_dblink_direct_data_exchange 取值为 1 时采用 select into server 进行 跨集群数据分发;取值为 0 时,将 select 结果转为 insert values 语句插入到目标 集群中。
对于版本差异较大的两个 GBase 8a 集群,因其 SIS 模块版本不兼容,需要设置 gcluster_dblink_direct_data_exchange=0 采用 insert values 方式进行跨集群的 数据流转,性能较差。
当 gcluster_dblink_direct_data_exchange=0,在 insert 操作时,网关支持两种 方式,具体如下:
当 load.data.type=1 时,使用 JDBC 的 PreparedStatement 执行单条批量 insert,该方式的优点是包含特殊字符的数据也可 insert,缺点是速度较慢。
当 load.data.type=0 时,使用 insert ...values(),(),()形式一次性 insert 多条数据, 该方式的优点是 insert 速度较单条批量 insert 速度快,缺点是在拼字符串时无法 处理特殊字符。
1.2.2 控制 dblink 拉表生成方式
t_gcluster_dblink_generate_interim_table_policy
t_gcluster_dblink_generate_interim_table_policy 控制 dblink 在拉表过程中, 生成目标临时表的方式,其作用域为 global、session 级。
取值范围:0、1 默认值:1
针对集群计划 dblink 拉表步骤, 目标临时表的结构生成方式:
0:使用自动评估方式,由投影表达式结果的数据类型确定;
1:请求网关使用 create...select ...limit 0 方式获取临时表的结构。 相对自动评估方式,临时表的列的数据类型评估更准确。
原文链接:
https://www.gbase.cn/community/post/3941
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。