1 尽量不用游标
标的操作类似将每行的值取出来,做一系列处理。如果可以去掉游标,改成一条包含多个相关子查询的sql,性能将大大提升。
2 能用varchar不用char
Char的空格可能影响性能;
Char和varchar的关联会导致关联不正确。
3 能用union all尽量不用union于union操作需要进行一次去重,去重对于性能影响很大,尽量保证相同数据只入库一次,不同表间无重复数据,进行union all性能会很大提升。
4 where条件中不支持别名
如sql :select a 字段 from t where 字段=1,gbase不支持
改为:select 表.字段 from ( select a 字段 from t ) 表 where 字段=1;
5 避免超大结果集的直接返回于查询结果集达到1万以上,尤其是百万、千万的结果集,应避免结果集的直接返回,将原始select修改为insert select,即将查询结果插入到一个结果表中或者在客户端输出时要加-q参数。
6 高精度decimal可能使性能变慢果系统升级前使用的是低精度decimal,则升级后的高精度decimal可能使得性能变慢,这是由于高精度decimal的关联,取值等操作均要耗费更多的资源,但是这种性能变慢是正常的,只要在一个合理可接受的范围内,就不需要考虑这个问题。
7 insert into … select … group by串行
现象:insert into … select … group by …并行按hash 划分,并且是多趟聚集,导致insert 部分串行执行。
原因:按hash划分数据,一趟执行不完的时候,group by操作占着线程,导致线程池中没有空闲线程,做insert时只能串行操作。
解决办法:
1)如果机器核数较多(>=32),可以将并行度调低到核数的一般,线程池使用缺省值(核数)即可;
2)如果核数<32,可以将并行度调大到核数的2倍。
8 hash分布键注意事项
1 )hash列字段在使用过程中禁止加如ltrim等函数处理操作,这样做会破坏hash分布,必须去掉,由外部保证字段数据的正确性。
例如:字段col1在group by、insert into select 投影列中对col1加的rtrim、ltrim破坏了hash分布,必须去掉。
2)group by语句如果含有hash列,将hash列放在最前面。
3)多个join列如果有hash列join的,将hash列join放到最前面。