GreenPlum学习笔记:基础知识
一、介绍
GreenPlum分布式数据仓库,大规模并行计算技术。
- 无共享/MPP核心架构
Greenplum数据库软件将数据平均分布到系统的所有节点服务器上,所以节点存储每张表或表分区的部分行,所有数据加载和查询都是自动在各个节点服务器上并行运行,并且该架构支持扩展到上万个节点。
- 混合的存储和执行(按列或按行)
Greenplum发明支持混合按列或按行存储数据,每张表或表分区可以由管理员根据应用需要,分别指定存储和压缩方式。基于这个功能,用户可以对任何表或表分区选择按行或按列存储数据和处理方式。这些是在建表或表分区的DDL语句中配置的,只需在建表或表分区时指定。这个功能基于Greenplum的多态维数据存储技术。
Master和Segment都是一个单独的PostgreSQL数据库。每一个都有自己单独的一套元数据字典。
Master节点一般也叫主节点,Segment叫做数据节点。
为了实现高可用,每个Segment都有对应的备节点 Mirror Segment分别存在与不同的机器上。
Client一般只能与Master节点进行交互,Client将SQL发给Master,然后Master对SQL进行分析后再将其分配给所有的Segment进行操作。
Greenplum没有Windows版本,只能安装在类UNIX的操作系统上。
Greenplumn极度消耗I/O资源,所以对存储的要求比较高。
- Master节点:是整个系统的控制中心和对外的服务接入点,它负责接收用户SQL请求,将SQL生成查询计划并进行并行处理优化,然后将查询计划分配(dispatch)到所有的Segment节点进行并行处理,协调组织各个Segment节点按照查询计划一步一步地进行并行处理,最后获取到Segment的计算结果,再返回给客户端;从用户的角度看Greenplum集群,看到的只是Master节点,无需关心集群内部的机制,所有的并行处理都是在Master控制下自动完成的。Master节点一般只有一个或两个(互为备份);
- Segment节点:是Greenplum执行并行任务的并行运算节点,它接收Master的指令进行MPP并行计算,因此所有Segment节点的计算性能总和就是整个集群的性能,通过增加Segment节点,可以线性化得增加集群的处理性能和存储容量,Segment节点可以是1~10000个节点;
- Interconnect:是Master节点与Segment节点、Segment节点与Segment节点之间的数据传输组件,它基于千兆交换机或万兆交换机实现数据在节点间的高速传输;
- 外部数据加载到Greenplum时,采用并行数据流进行加载,直接加载到Segment节点,这项独特的技术是Greenplum的专有技术,以此保证外部数据在最短时间内加载到数据库中。
二、基本语法
1.create table
- 在Greenplum中建表时需要指定表的分布键
- 如果表需要用某个字段分区,可以通过partition by将表建成分区表
- 可以使用like操作创建与like的表一样结构的表,功能类似 create table t1 as select * from t2 limit 0
- 可以使用inherits实现表的继承
Greenplum是一个分布式数据库,有两种数据分布策略:
- Hash分布:指定一个或多个分布键,计算hash值,并且通过hash值路由到特定的Segment节点上,语法为Distributed by(...)。如果不指定分布键,默认将第一个字段作为分布键。
- 随机分布:也叫平均分布,数据随机分散在每一个节点中,这样无论数据是什么内容,都可以平均分布在每个节点上,但是在执行SQL的过程中,关联等操作都需要将数据重分布,性能较差。语法为在表字段定义的后面加上Distributed randomly。
2.select
- 分页采用offset加limit操作
- select可以不用加from子句
- 不加order by的话,查询结果顺序是随机的
3.create table as与select into
- 可以使表根据直接执行select的结果创建出一个新的表,这个在临时分析数据的时候十分方便。
- select into的语法比create table as更简单,虽然功能一样,但是执行select into不能指定分布键,只能使用默认的分布键。
4.explain
- 查询表的执行计划
5.insert/update/delete
- insert的时候分布键不要为空,否则分布键默认会变成null,数据都被保存在一个节点上,造成数据分布不均。
- 不能批量对分布键执行update,因为对分布键执行update需要将数据重分布,Greenplum暂时不支持这个功能。
- Greenplum 3.x版本中,如果delete操作涉及子查询,并且子查询的结果还会涉及数据重分布,这样的删除语句会报错。对整张表执行Delete较慢,有此需求时建议使用truncate。
6.truncate
- 与oracle一样,执行truncate直接删除表的物理文件,然后创建新的数据文件。truncate操作比delete操作在性能上有非常大的提升,当前如果有sql正在操作这张表,那么truncate操作会被锁住,直到表上面的所有锁被释放。
三、常用数据类型
1.数值类型
- smallint
- integer
- bigint
- decimal
- numeric
- real
- double
- serial
- bigserial
2.字符类型
- character varying(n)
- varchar(n)
- character(n)
- char(n)
- text
3.时间类型
- timestamp
- interval
- date
- time
四、常用函数
1.字符串函数
- string || string 字符串连接
select 'abc'||'def';
- length(string) 字符串长度
select length('abcd');
- position(substring in string) 指定子字符串的位置
select position('ab' in 'foanegabdafeab');
- substring(string from 2 for 5) 抽取子字符串,从第2位开始,取5位
select substring('abcdefghij' from 2 for 5);
- trim(leading/trailing/both 'x' from string)从字符串string的开头/结尾/两边删除只包含characters中字符(默认是空白)的最长的字符串
select trim(both 'x' from 'xTomxxx');
- lower(string) 小写
- upper(string) 大写
select lower('ADENG'), upper('dfsen');
- overlay(string placing string from 2 for 4) 替换子字符串
select overlay('Txxxxas' placing 'hom' from 2 for 4);
- replace(string,from,to) 把字符串string中出现的所有子字符串from替换成子字符串to
select replace('abdadfabadfab','ab','XX');
- split_part(string,delimiter,field) 根据delimiter分隔string返回生成的第field个子字符串(1开始)
select split_part('abc***def***fff','***',2);
2.时间函数
- age(timestamp, timestamp) 减去参数后的”符号化”结果
select age(timestamp '2001-04-10', timestamp '1957-06-13');-- 43 years 9 mons 27 days
- age(timestamp) 从current_date减去参数中的日期
select age(timestamp '2001-04-10'); -- 17 years 3 mons 27 days
- current_date 当前的日期
select current_date; -- 2018-08-07
- current_time 当前时间
select current_time; -- 10:14:27.558098+08
- current_timestamp 当前事务开始时的时间戳
select current_timestamp; -- 2018-08-07 10:29:22.029703+08
- date_part(text, timestamp) 获取子域,等同于extract
select date_part('hour', timestamp '2001-02-16 20:34:13')
- date_trunc(text, timestamp) 截断成指定的精度
select date_trunc('hour', timestamp '2001-02-16 20:34:13')
- extract(field from timestamp) 获取子域 同date_part
select extract('hour' from timestamp '2001-02-16 20:34:13')
- now() 当前事务开始的时间戳
select now() -- 2018-08-07 10:35:13.367511+08
使用interval类型可以直接对事件类型进行计算,用来计算时间的加减
3.数值计算函数
- abs 绝对值
- ceil、ceiling 最小整数
- exp 自然指数
- ln 自然对数
- log 以10为底的对数
- log(b,x) 以b为底的对数
- mod(y,x) y/x的余数
- pi() 派
- power(a,b) a的b次幂
- random() 0-1之间的随机数
- floor() 最大整数
- round(x,s) s位小数
- sign(x) 符号化
- sqrt(x) 平方根
- cbrt(x) 立方根
- trunc(x,s) 截断为s位小数
4.其他常用函数
- generate_series(x,y,t)
序列号生成函数,生成多行数据从x到y,步长为t,默认是1。
select generate_series(2,20,2);
- md5、hashbpchar
hash函数
md5的hash算法精度为128位,返回一个字符串
hashbpchar的精度是32位,返回一个integer类型
select hashbpchar('');
select hashbpchar('helloworld');
- 分析函数
- 聚合函数返回各个分组的结果
- 开窗函数则为每一行返回结果
rank()、row_number() over(partition by a order by b)
三、注意点
1.缩进风格:必须使用空格,不允许使用【Tab】键。以免在用不同的编辑器阅读程序时,因【Tab】键 所设置的空格数目不同而造成程序布局不整齐;
2.适量换行:避免将复杂的SQL 语句写到同一行,建议要在关键字和谓词处换行。
3.*号规则:避免使用SELECT * 语句;不要用*来代替所有字段,应给出字段列表,以避免在表结构发生变化时应用程序出现无法识别的情况。
4.长度匹配规则:确保变量和参数在类型和长度上与表数据列相匹配。如果与表数据列宽度不匹配,则当较宽或较大的数据传进来时会产生运行异常。
END 2018-08-02 09:59:53
GreenPlum学习笔记:基础知识的更多相关文章
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- three.js学习笔记--基础知识
基础知识 从去年开始就在计划中的three.js终于开始了 历史介绍 (摘自ijunfan1994的转载,感谢作者) OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于Op ...
- SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数
Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下: ...
- Java Script 学习笔记 -- 基础知识
Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...
- java虚拟机JVM学习笔记-基础知识
最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--java虚拟机 媒介:JVM是每一位从事Java开发工程师必须翻越的一座大山! JVM(Java Virtual Machine)JRE ...
- hadoop学习笔记——基础知识及安装
1.核心 HDFS 分布式文件系统 主从结构,一个namenoe和多个datanode, 分别对应独立的物理机器 1) NameNode是主服务器,管理文件系统的命名空间和客户端对文件的访问操 ...
- php学习笔记——基础知识(2)
9.PHP语句 if 语句 - 如果指定条件为真,则执行代码 if...else 语句 - 如果条件为 true,则执行代码:如果条件为 false,则执行另一端代码 if...else if.... ...
- php学习笔记——基础知识(1)
1.PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果. 2.基础 PHP 语法 1)PHP 脚本可放置于文档中的任何位置. 2)PHP 脚本以 <?php 开头,以 ?> ...
- Redux学习笔记-基础知识
Redux概述 是什么:Redux是管理状态的容器,提供可预测的状态管理. 怎么做:Redux主要是用来管理组件或者应用的状态,本质上跟一个事件处理器差不多.通过分发action触发reduce来 ...
- GO Lang学习笔记 - 基础知识
Go lang Learn Note 标签(空格分隔): Go Go安装和Go目录 设置环境变量GOROOT和GOPATH,前者是go的安装目录,后者是开发工作目录.go get包只会将包下载到第一个 ...
随机推荐
- eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决
转: eclipse安装activiti5.18.0工作流插件 以及安装过程中activiti插件出现的问题及解决 2017年05月04日 18:44:21 JJ_nan 阅读数:2773 版权声 ...
- CDOJ--1141
原题链接:http://acm.uestc.edu.cn/problem.php?pid=1141 分析:运用欧拉函数可解此题. #include <iostream> #include ...
- Python如何引入自定义模块?
Python运行环境在查找库文件时是对 sys.path 列表进行遍历,如果我们想在运行环境中注册新的类库,主要有以下四种方法: 1.在sys.path列表中添加新的路径.这里可以在运行环境中直接修改 ...
- UVAL 7902 2016ECfinal F - Mr. Panda and Fantastic Beasts
题意: 给出n个串,求一个最短的第一个串的子串使它不在其他的n-1个串中出现,若有多个求字典序最小的. Limits: • 1 ≤ T ≤ 42. • 2 ≤ N ≤ 50000. • N ≤ S1 ...
- Linux运维四:文件属性及文件权限
一:文件属性 我们使用ls -lhi命令来查看文件时,会列出一堆的文件属性,如: [root@Gin day7]# ll -hi total 7.8M 260674 -rw-r--r-- 1 root ...
- Java基础-IO流对象之字节流(Stream)
Java基础-IO流对象之字节流(Stream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在前面我分享的笔记中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现 ...
- [应用篇]第三篇 JSP 标准标签库(JSTL)总结
有一种友谊叫做: "陪我去小卖部." "不去," "我请你" "走." 你想起了谁:胖先生?还有人陪你吗? JSP 标准 ...
- go build 不同系统下的可执行文件
Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. 1.Mac下编译Linux, Windows平台的64位可执行程序: 1 2 $ CGO_ENABLED=0 GOOS=linu ...
- Linux清屏命令
1:clear 2:Ctrl+L 3:printf "\033c" 4:ALT+F8 By KillerLegend Ref:http://www.coolcoder.in/201 ...
- 打包python脚本为exe的坎坷经历, by pyinstaller方法
打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...