2.1 Greenplum 相关概念
2.1.1 整体介绍
Greenplum的架构采用了MPP(大规模并行处理)。在 MPP 系统中,每个 SMP节点也可以运行自己的操作系统、数据库等。换言之,每个节点内的 CPU 不能访问另一个节点的内存。节点之间的信息交互是通过节点互联网络实现的,这个过程一般称为数据重分配(Data Redistribution) 。与传统的SMP架构明显不同,通常情况下,MPP系统因为要在不同处理单元之间传送信息,所以它的效率要比SMP要差一点,但是这也不是绝对的,因为 MPP系统不共享资源,因此对它而言,资源比SMP要多,当需要处理的事务达到一定规模时,MPP的效率要比SMP好。这就是看通信时间占用计算时间的比例而定,如果通信时间比较多,那MPP系统就不占优势了,相反,如果通信时间比较少,那MPP系统可以充分发挥资源的优势,达到高效率。
中国已有:中信实业银行,东方航空公司,阿里巴巴,华泰保险,中国远洋(Cosco),李宁公司等大型企业用户选择Greenplum的产品。
2.1.2 shared-nothing概念
Shared Everthting:一般是针对单个主机,完全透明共享CPU/MEMORY/IO,并行处理能力差,典型的代表SQLServer。 shared-everything架构优点很明显,但是网络,硬盘很容易就会成为系统瓶颈。
Shared Disk:各个处理单元使用自己的私有 CPU和Memory,共享磁盘系统。典型的代表Oracle Rac, 它是数据共享,可通过增加节点来提高并行处理的能力,扩展能力较好。其类似于SMP(对称多处理)模式,但是当存储器接口达到饱和的时候,增加节点并不能获得更高的性能 。
SharedNothing:各个处理单元都有自己私有的CPU/内存/硬盘等,不存在共享资源,各处理单元之间通过协议通信,并行处理和扩展能力更好。各节点相互独立,各自处理自己的数据,处理后的结果可能向上层汇总或在节点间流转。Share-Nothing架构在扩展性和成本上都具有明显优势。
2.1.3 MPP 理解
大规模并行处理系统是由许多松耦合处理单元组成的,借助MPP这种高性能的系统架构,Greenplum可以将TB级的数据仓库负载分解,并使用所有的系统资源并行处理单个查询。
2.1.4 MVCC 概念
与事务型数据库系统通过锁机制来控制并发访问的机制不同, GPDB使用多版本控制(Multiversion Concurrency Control/MVCC)保证数据一致性。
这意味着在查询数据库时,每个事务看到的只是数据的快照,其确保当前的事务不会看到其他事务在相同记录上的修改。据此为数据库的每个事务提供事务隔离。
MVCC以避免给数据库事务显式锁定的方式,最大化减少锁争用以确保多用户环境下的性能。在并发控制方面,使用MVCC而不是使用锁机制的最大优势是,
MVCC对查询(读)的锁与写的锁不存在冲突,并且读与写之间从不互相阻塞。
2.2 OLTP与OLAP的理解
2.2.1 描述概念
Greenplum 支持OLTP与OLAP机制,同时也支持AO表与堆方式储存,其中OLTP与OLAP的特点如下:
OLTP(On-Line Transaction Processing,联机事务处理)系统也称为生产系统,它是事件驱动的、面向应用的,比如电子商务网站的交易系统就是一个典型的OLTP系统。OLTP的基本特点是:
数据在系统中产生,
基于交易的处理系统(Transaction-Based),
每次交易牵涉的数据量很小,
对响应时间要求非常高,
用户数量非常庞大,主要是操作人员,
数据库的各种操作主要基于索引进行。
OLAP(On-Line Analytical Processing,联机分析处理)是基于数据仓库的信息分析处理过程,是数据仓库的用户接口部分。OLAP系统是跨部门的、面向主题的,其基本特点是:
本身不产生数据,其基础数据来源于生产系统中的操作数据(OperationalData)
基于查询的分析系统,
复杂查询经常使用多表联结、全表扫描等,牵涉的数据量往往十分庞大,
响时间与具体查询有很大关系,
用户数量相对较小,其用户主要是业务人员与管理人员,
由于业务问题不固定,数据库的各种操作不能完全基于索引进行。
2.2.2 图示解释
OLTP与OLAP的比较
OLTP与OLAP对于硬件的要求
2.3 其他名词概念
2.3.1 HTAP概念
HTAP(Hybrid Transactional / Analytical Processing)
一份数据,支持在线事务与在线分析
分布式share nothing架构,线性扩展
3-15倍压缩
https://yq.aliyun.com/articles/193401?utm_content=m_29900
2.3.2 Append-only 的概念
AO表为追加存储,当删除、更新记录时,有一个BITMAP对象来存储对应的记录是否被删除。对于AO存储,虽然是appendonly,但实际上GP是支持DELETE和UPDATE的,被删除或更新的行,通过BITMAP来标记,性需要用vacuum来释放。
2.4 数据仓库设计规则
2.4.1 数据仓库概念
数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
2.4.2 数据仓库设计规则相关资料
具体的可以参考数据仓库之父Bill Inmon在1991年出版的"Building the Data Warehouse",下载地址为:链接: https://pan.baidu.com/s/1I5ImKxDv0Jbx3psqTY2TzQ 提取码: gm8k
2.4.3 数据仓库设计规范参考
名词 | 名词简称 | 名词解释 |
Data Warehouse | DW | 数据仓库主体 |
Operational Data Store | ODS | 数据原始接入层,需要对数据频繁的增删改查,是支持对近期数据的OLTP查询,以减轻业务系统负载。 |
Data Warehouse Detail | DWD | 数据源的细节层,有的也称为ODS层,是业务层与数据仓库的隔离层,在该层可以把业务表分的更细 |
Data Warehouse Base | DWB | 数据仓库基础数据层, |
Data Warehouse Service | DWS | 服务数据层,基于DWB上的基础数据,主要整合汇总最终的结果供应用层使用,一般是宽表和高度压缩表。 |
Data Warehouse History | DWH | 该层不在数据仓库设计的范围之内,按照业务新增的数据层,主要储存历史数据。 |
Data Warehouse Exception | DWE | 该层不在数据仓库设计的范围之内,按照业务新增的数据层,主要储存异常数据。 |
Enterprise Data Warehouse | EDW | 作为企业唯一的数据仓库,EDW提供统一的数据服务,查询结果有效一致。数据设计支持跨部门,支持海量数据,并支持大量的查询请求。 |
Data Mart | DM | 和EDW类似,但更专注于部门级别而不是公司级别的统一数据服务。提供EDW不能提供的,针对部门的特殊数据服务需求 |
BI/Analytic Database | BID/AD | 为商业智能和分析而优化的数据处理技术。包括数据清理,ETL,数据挖掘等。生产报表,也支持adhoc查询,数据反范式设计。 |
Data Lake Database | DLD | 该层存储非加工数据,比如日志、视频等,以后结构化数据,并且不分类, |
详细资料请参考:https://blog.csdn.net/xfg0218/article/details/85092196
2.5 常用命名规范
在数据库中常用到表,序列,过程,触发器,索引等的命名规范
2.5.1 表的命名规范
1、表的命名应该简单明了,禁止使用关键字作为表名。
2、表明应以下划线作为作为单词的划分,增量表应该添加后缀的日期,例如:t_ent_baseinfo_20181024
3、同一模块的表使用相同的前缀,表名含义简单明了
4、表名的长度不得超过40个字符
1、字段使用英文单词的全称或简写,意思简单明了,单词之间以下划线分割,禁止使用驼峰规则。
2、各表之间的相同的字段的含义保持一致
2.5.2 索引的命名规范
索引的创建要以表明加字段名加INDEX作为组合使用,例如:t_ent_baseinfo_pripid_index
2.5.3 函数命名规范
1、函数的名字禁止超过40个字符
2、数据处理的过程采用proc加业务的名字,例如:proc_t_ent_baseinfo_sink2hdfs该名字代表把t_ent_baseinfo表中的数据加载到HDFS上
3、公共方法采用fn加业务的名字,例如:fn_t_ent_baseinfo_convert_finled表示在表t_ent_baseinfo中转换字段
2.5.4 视图命名规范
1、视图采用v加表明加加具体的业务含义,例如:v_t_ent_baseinfo_convert_finled表示在表t_ent_baseinfo中字段的转换即可。
2.6 SQL使用规范
2.6.1 SQL最基本的原则
1、代码行清晰、整齐、层次分明、结构性强,易于阅读。
2、代码中应具备必要的注释以增强代码的可读性和可维护性。
3、代码应充分考虑执行效率,保证代码的高效性。
2.6.2 避免不必要的操作
1、避免使用select * from tablename查询数据与字段信息
2、 查询记录行的个数不要使用count(*),而要制定一个有索引的字段
3、如果有分区表,尽量把分区键作为查询的第一个条件
4、删除表中的所有数据时,要使用truncate不要使用delete
5、查询语句中查询条件尽量在索引字段上,避免做大表的扫描
6、避免在索引上进行计算,例如
低效:
SELECT * FROM DEPT WHERE SAL * 12 > 25000;
高效:
SELECT * FROM DEPT WHERE SAL > 25000 / 12;
- 避免在索引列上使用IS NULL和IS NOT NUL,例如:
低效:(索引失效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
高效:(索引有效)
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >=0;