mpp使用注意事项(分布键)

各位好!

我之前写的内容是都是自己学习python写的一些笔记及自己编写的小脚本。
其实我本人是一位数据库开发人员。15年开始工作,熟悉oracle数据库、擅长mpp数据库,mpp数据库熟悉Teradata,国产列式数据库Gbase 8a。Greenplum有简单使用过(当时公司挑选时候性能不好而pass了,简单语法了解过。用客户的话说,都是出来混的,谁能比谁差哪去,所以当时GP性能不好的原因有可能是我们安装的数据库系统配置没调整好,导致的性能差异)熟悉的etl工具有Informatica、kettle。
之前工作经常都是sql脚本,目前本人最擅长的技能还是sql编写及优化。在工作中时常遇到各类计算汇总问题,本人通过写另类sql去取值。
但是工作中,离不来shell脚本,perl,python现在对于python更是越用越多。目前shell和python都属于初级水平吧。工作中写简单的监控脚本,文本处理,修改脚本等都可以正常完成。对于shell三剑客“grep”,“sed”,“awk”都有使用。对于python函数,类,文本处理,xls处理等都没有问题。perl语言由于现在用的公司越来越少了。所以我也不太熟悉。只能简单修改他人脚本,并仿照写一些简单的脚本(本人平心说,perl语言真的很强大,可是语法看着有些复杂,不太好理解,而且特殊的语法更不容易读懂)。
对传统数据仓库熟悉,像ods层,edw层,dm层都曾经工作过,在dm集市层,主要就是面对具体的业务了。对于业务要求要很熟悉,数据基本来自edw层,也就是数据仓库里,通过数据仓库进行出日报,周报,月报等。最常见的就是提数。而ods层就是生产系统的贴源层。用于保障生产系统的安全。表结构与源系统一致,将各个源系统对应放在ods层,供edw层使用。ods层数据可以做成与生产系统实时,或者T+1的。edw层就是供dm层使用的,所以对ods层数据根据业务端进行简单的汇总。对于经常汇总的指标,在edw层统一计算好,供下游使用。
以上扯得有点远。今日主要讲一下mpp使用注意事项。
mpp——大规模并行处理
mpp的sql优化主要是进行数据拆分,分库,分区,分表。因为数据量巨大,在生产中经常大批量dml,不建议建立索引,对生产影响巨大。mpp使用中因为是大规模并行处理,所以在每个数据节点最理想的状态是数据都平均分布,保证每个计算节点的计算性能。这就好比是一个木桶,要保证每个木板的长度均匀,这样才能装最多的水,所以mpp数据库要保证数据平均,防止数据倾斜。所以一定在建立表的时候,根据业务及表数据分布来指定好分布键。每个数据库都有自己的区别,td数据库可以指定多个字段为分布键,包括date类型,但是gbase数据库只能指定varchar类型和数字类型,且只能指定一个字段为分布键。td在不指定pi分布键默认为第一个字段为分布键。gbase不指定分布键将进行随机分布。
mpp数据库在表关联时候,尽量用分布键作为关联,这样保证数据在自己计算节点进行关联,而不用进行数据重分布。在进行update时候,最好是进行关联查询,然后insert。尤其gbase这种列存储。
我当时在mpp数据库为了体现自己sql水平,经常写嵌套好几层的sql,来一步实现。可是后来发现,这样真的很影响性能。所以不要写复杂关联的sql,应该进行关联后存放在临时表,再进行与其他表进行关联。这样计算真的快,虽然体现不出sql水平来,可是在mpp架构中真的不需要写大而复杂的sql。

你可能感兴趣的:(数据库知识)