TDH sql及plsql的调优
3.1.1 表类型的优化
3.1.2表分桶分区的优化
3.1.3 临时表的使用
3.2.1 列裁剪
3.2.2 条件下压
3.2.3 DISTINCT的优化
3.2.4 null处理优化
3.2.5 小文件过多的优化
3.2.6 范围分区表merge into的优化
3 PLSQL调优
3.1 表的优化
3.1.1 表类型的优化
文本表主要在数据的导入导出中作为过度表使用,支持insert和load操作,支持分区分桶,一般对于跑批,我们选择ORC格式的表,ORC为列式存储,通常压缩比为3~8,同时具有轻量级的索引,包括minmaxFilter和BloomFilter,只支持insert,不支持load,如果该表需要进行事务操作,则需使用ORC事务表,
3.1.2表分桶分区的优化
此处优化针对于ORC表:
如果数据量达到百万级,则需对表进行分桶,分桶字段尽量选择离散度较高的列,以避免造成 Bucket的大小过于悬殊,通常如果为ORC表一个桶数据量为压缩前200M,如果为ORC事务表一个桶数据量为压缩前100M,同时分桶数最好为质数,分桶的数量在建表时确定以后就不可更。如果表数据量较大还可进行分区,单值分区或范围分区。
3.1.3
.2 SQL优化
3.2.1 列裁剪
由于ORC为列式存储,对于宽表而言,select 字段 from xxx 能有效减少执行过程中的shuffle量,如果某一列重复数据特别多,在保证查询结果不变的情况下 使用group by去重。
3.2.2 条件下压
对于某些已知条件的过滤如果能在join前过滤,则先过滤再去join,如果过滤字段为分区字段,还可进行Partition过滤来减少数据量。尽可能的将小表放在join的左端。
3.2.3 DISTINCT的优化
对于COUNT(DISTINCT cust_isn)涉及 DISTINCT 的操作是由 Reduce Task 负责完成的,如果 Distinct Value 比较多,则单个 Reduce就很可能会成为性能瓶颈。所以在执行此类操作之前,我们可以利用 GROUP BY先做去重,然后再进行统计,以提高 SQL的执行效率。
3.2.4 null处理优化
对于join key含有大量null值,如果不对其做特殊处理,则有可能出现关联倾斜,如:
3.2.4 null处理优化
对于join key含有大量null值,如果不对其做特殊处理,则有可能出现关联倾斜,如:
Select
a.id,b.name
from
a left join b
on
a.id=b.id
如果a.id存在大量null值 则拆分为
Select
a.id,b.name
from
a left join b
on a.id=b.id
where
a.id is not null
union all
Select
a.id
,null
from
a
where
a.id is null
或者
Select
a.id
,b.name
from
a left join b
-- NVL返回值为表达式2的值,否则返回表达式1的值。 该函数的目的是把一个空值(null)转换成一个实际的值
on nvl(a.id,uniq())=b.id
3.2.5 小文件过多的优化
如对同一张表进行多次CURD操作,则会导致底层存储文件过多,则可控制合理的map,reduce个数,设置合理参数ngmr.partition.automerge,mapred.reduce.tasks
3.2.6 范围分区表merge into的优化
当目标表为范围分区表时,如果只需对某一个分区内的数据进行merge,常规的merge 语句执行时,inceptor会扫描全表,导致效率低下,甚至由于单个task处理数据量过大而报错,这时可将merge语句改为 merge into (select * from default.xxx where date=‘日期’) 来告诉inceptor将要对哪些数据做merge。