对于数据库来说,效率是最重要的指标之一。要提升数据库性能,要做好以下几方面工作:数据库设计,SQL语句优化、数据库参数配置、恰当的数据资源和操作系统等。

今天给大家介绍下GCluster参数优化方法。

1.查询优化参数

  • gcluster_hash_redistribute_groupby_optimize

这个参数用于控制是否启用groupby模式,默认1(0 - 关闭, 1 - 启用)
如果开启此选项,进行分组(group by)运算之前,将会把临时结果利用哈希算法重分布到各个运算节点,再由各个节点进行分组运算。由于数据在分到各个节点之前已经做了哈希,因此产生的结果直接汇总即可得到最终结果,不再需要由汇总节点再做一次分组。

gcluster_hash_redistribute_join_optimize

这个参数用于控制是否启用Hash重分布的JOIN模式,默认2(0 – 拉复制表,1 – 动态hash,2-自动评估)
如果开启此选项,在两个分布表进行等值join 运算时,将对其中一个表的数据根据连接条件列的值进行动态哈希。然后利用各个运算节点上动态哈希后的临时表和另一个表进行join 运算。这样,各节点的运算结果直接汇总即可得到最终结果。这种策略不会将其中一个分布表在所有运算节点上拉成复制表,每个运算节点只需接收这个表的一部分数据。如果参数设置为2 则当两表的数据量相差不超过20% 时,使用哈希重分布JOIN;否则不使用。

gcluster_special_correlated_optimize

该参数用于控制是否开启相关子查询hash重分布优化。父子查询是相关子查询关系,并且存在等值JOIN关系,则将父子查询按JOIN列进行hash重分布后执行。
•参数 = 0 关闭;
•参数 = 1 启用;
•该参数的默认值是1。

使用等值hash重分布相关子查询功能需要配合参数gcluster_crossjoin_use_hash_distribution来一起使用,使用原则如下:
•当gcluster_special_correlated_optimize = 0时,无论如何设置参数gcluster_crossjoin_use_hash_distribution的值,都不会开启本优化。
•当gcluster_special_correlated_optimize = 1,而gcluster_crossjoin_use_hash_distribution = 0时,也不会开启本优化。
•当gcluster_special_correlated_optimize = 1,并且gcluster_crossjoin_use_hash_distribution = 1时,才会开启本优化。

示例如下:
SELECT COUNT(*) FROM x1 WHERE EXISTS (SELECT 1 FROM x2 WHERE x1.id2 = x2.id2);
等值hash相关子查询优化,分别对x1,x2进行动态重分布。

gcluster_crossjoin_use_hash_distribution

这个参数用于设置当JOIN两边都不是hash列时,是否仍强制走hash重分布JOIN。
•参数 = 0:表示关闭,即当JOIN两边都不是hash列时,不使用hash重分布JOIN功能;
•参数 = 1:表示开启,即当JOIN两边都不是hash列时,使用hash重分布JOIN功能;
•该参数的默认值是1。

gcluster_empty_result_set_optimize

这个参数用于设置是否启用空结果集优化功能。默认为 0(0 – OFF, 1 - ON)。空结果集优化,如果优化阶段可判断结果集为空,则直接返回,而不需要让执行器进行执行。

gcluster_single_hash_node_optimize

单表hash条件的优化,当单表包含hash列的等值条件时,进行hash优化,sql语句仅仅发送给单个节点。默认为1(0 - OFF, 1 - ON)。

gcluster_hash_join_complex_optimize

子查询和父查询满足hash关系的优化,可当作一个整体部分来执行。这个参数用于控制是否在子查询和父查询满足hash关系的优化时,当作一个整体部分来执行。
•参数 = 0 禁用,满足hash关系的优化时,不当作一个整体部分执行;
•参数 = 1 启用,满足hash关系的优化时,当作一个整体部分执行。
•该参数的默认值是1。

gcluster_union_optimize

这个参数用于设置是否使用union优化。使用union优化时,union 优化尽量把union 语句发送到节点执行,避免把所有需要union的表都拉成复制表。即利用union的结果集去重的特性,直接将union发送到下层去执行。这样在某些情况下,可以大大减小汇总节点的中间结果集的大小。
•参数 = 0:不使用union优化;
•参数 = 1:使用union优化。
•默认值为1

gcluster_starschema_join_estimate_optimize

设置评估两表join结果的方式,0:按照两表行数相乘进行评估;1:按照两表中的大表的行数进行评估,默认值是1。

gcluster_delayed_group_by_optimize

设置group by是否下发到gnode执行,当group by下发到gnode 执行后结果集并没有明显减少时,请设置该参数为1,(0 - OFF, 1 - ON)。

gcluster_count_optimize

设置对单表进行count(*)时,不产生中间结果表,gcluster直接计算结果值。
•0:按照产生中间表的方式执行;
•1:gcluster 直接计算count值。count短路优化功能开启,优化阶段会将sql下发到各个gnode节点计算,直接返回结果,不再执行生成查询计划和生成临时表的逻辑;
•2:在1的基础上,如果数据表是hash分布表,且sql的where conditions满足single hash opt condition,执行器将根据hash value计算sql下发的目标gnode,下发sql到目标gnode节点计算,不再下发到所有gnode计算,提高小查询并发。

优化点: count(*) 时原来的策略是先在发起节点上的gnode上创建一个临时的汇总表, 把各个节点的执行结果汇总到该临时的汇总表上,然后对该临时的汇总表再做sum的汇总,汇总完成后再删除临时的汇总表,当有高并发时,频繁的创建和删除临时的汇总表将降低性能, 现在修改为不创建临时的汇总表,把各个节点的执行结果收集到gcluster上,由gcluster直接计算,因此不需要创建和删除临时的汇总表,从而提高性能。

gcluster_count_optimize取值为1时的count sql优化需具备的条件:

•没有使用dblink表;
•没有union、minus、intersect;
•没有非相关子查询;
•没有标量子查询;
•没有from子查询;
•没有相关子查询;
•不是select...into;
•投影列只有1列;
•没有group by子句;
•没有order by;
•没有having;
•没有limit和offset;
•没有distinct;
•没有join;
•没有复制表;
•投影列必须为count但不是count distinct。

gcluster_count_optimize取值为2时的count sql优化需具备的条件:

•满足上述取值为1时的所有条件;
•且使用的数据表为hsah分布表,where conditions 中必须符合单点hash优化执行的条件。

样例:select count(1) from t where t.distr_col=常量;
关闭优化400并发吞吐量3905/s,开启优化400并发吞吐量6055/s。

2.并发参数

gcluster_serial_exec_query

优化点:因为gnode没有自动的资源管理能力,当高并发时,gnode因为各个并发的SQL进行资源争抢,反而导致执行性能下降,因此可通过gcluster 来控制下发给gnode的SQL数来达到对gnode使用资源的间接控制,让gnode的各个并发的SQL不要进行资源的争抢,从而提高性能, 可通过在gcluster配置文件中设置gcluster_serial_exec_query = 批量提交数(单节点cpu核数)来控制提交到gnode的SQL数。
该参数默认为0(不限制)。

gcluster_max_conn_in_pool

优化点:没有线程池时,gcluster访问gnode的并发数量将不受控制,gcluster访问每一个gnode都将启动一个新的线程,高并发时大量的线程将消耗系统资源及增加了gnode的压力,当采用线程池后,并发请求竞争同一个线程池中的线程,所以,通过最大线程数能够严格控制gcluster访问gnode的并发数量,从而减少gnode的压力和降抵线程对系统资源的消耗。
该参数默认为300。

gcluster_use_conn_pool

优化点:没有连接池时,gcluster访问gnode的连接数量将不受控制,gcluster访问每一个gnode都将启动一个新的连接,这样就增加了到gnode的连接时间,并且高并发时将有大量的连接消耗系统资源,当采用连接池后,并发请求竞争同一个连接池中的连接,所以,通过最大连接数能够严格控制gcluster访问gnode的并发数量,从而减少gnode的压力和降抵连接对系统资源的消耗。
(0-OFF,1-ON)

gcluster_insertselect_use_values_optimize

优化点:多个insert into t1 select * from t 当高并发时,在 gnode上只能够串行执行,影响执行效率,但如果按照insert into t1 values()的方式是允许并发执行的。
用例:
INSERT into TB_SVC_SUBS_HIST_TMP1
SELECT *
FROM TB_SVC_SUBS_HIST
WHERE 
MSISDN=MSISDN=’xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx’
适用场景:insert select高并发,并且select 的结果集不是很大。
(0-OFF,1-ON)

gcluster_single_hash_node_optimize 

•0:代表单点hash优化关闭。
•1:用于单表等值hash查询条件的优化,当单表包含hash列的等值条件时,进行hash优化,sql语句仅仅发送给单个节点。
•2:用于单表及from子查询等值hash查询条件的优化,当单表及from子查询包含hash列的等值条件时,进行hash优化,sql语句仅仅发送给单个节点。
•3:支持单表优化和多表join情况,包括inner join、left join、right join,不支持full join,进行hash优化,sql语句仅仅发送给单个节点。
默认值为1:开启 

示例:select * from bas.clcinfdta where 1=1 and clt_nbr=‘7319022720’ limit 30 offset 0 
不能查到记录,去掉1=1即可正确查询 
可设置gcluster_single_hash_node_optimize=0,临时关闭
设置为3时的优化性能参考:
单个jmeter20并发开启优化参数single_hash=3吞吐量20.2/sec;关闭优化参数吞吐量15.3/sec;
单个jmeter50并发开启优化参数single_hash=3吞吐量27.2/sec;关闭优化参数吞吐量19.2/sec;
单个jmeter100并发开启优化参数single_hash=3吞吐量28.9/sec;关闭优化参数吞吐量20.3/sec; 

_gbase_enable_hashtree 

默认值为1(启用),用于join时连接值重复较多效率低下; 
值为0时join不启用hashtree,使用链表结构连接。 

gcluster_ddl_parallel_execute 

这个参数用于控制DDL并行或者串行执行。
•参数 = 0:串行执行;
•参数 = 1:并行执行
•该参数的默认值是0 

GCluster参数优化先给大家介绍这些,关于性能优化其他参数调整,敬请关注后续文章,谢谢!