当前位置: 首页 > 编程日记 > 正文

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('100');
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

转载于:https://www.cnblogs.com/hider/p/9405415.html

相关文章:

java 套接字关联的通道_Java 通道教程 – NIO 2.0

# Java 通道教程 – NIO 2.0> 原文: [https://howtodoinjava.com/java7/nio/java-nio-2-0-channels/](https://howtodoinjava.com/java7/nio/java-nio-2-0-channels/)通道是继[**缓冲区**](//howtodoinjava.com/java-7/nio/java-nio-2-0-working-with-buffers/ &…

虚拟机ubuntu14.04系统设置静态ip

ubuntu14.04 设置静态ip vim /etc/network/interfaces 原来只有 auto lo iface lo inet loopback 修改成如下: auto lo iface lo inet loopbackauto eth0 iface eth0 inet static #静态ip address 192.168.1.6 #要设置的ip gateway 192.168.1.1 #这…

高职信息安全比赛攻防思路_30.LNGZ2020-30:2020年辽宁省职业院校技能大赛(高职组)“信息安全管理与评估”赛项规程...

12020年辽宁省职业院校技能大赛(高职组)信息安全管理与评估赛项规程一、赛项名称赛项编号:LNGZ2020-30赛项名称:信息安全管理与评估英文名称:Information Security Management and Evaluation赛项组别:高职组赛项归属:…

oracle rac对心跳要求_关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)...

关于心跳网络引起的Oracle RAC的节点驱逐(不是实例驱逐)问:假设如下场景:4个节点rac,心跳线走的是千m网络交换机,若是该千M网络交换机断电,我想知道crs的驱逐节点的算法是怎么样的?Oracle 大连 GCS 答复&am…

php 字符串数组转数组对象_php怎么将数组转成对象?

php将数组转成对象的方法:1、使用数据类型转换,在数组变量前添加“(Object)”来将数组转成对象。2、先使用json_encode()函数将数组转换为json字符串;然后使用json_decode()函数将json字符串转换成对象。php将数组转成对象有时候数组要转为对…

如何在Win7电脑上增加新磁盘分区?

我们在重装好系统Win7系统后有时会碰到需要新建磁盘分区的情况,这时我们再重装系统进行磁盘分区就有些过于麻烦了,其实我们可以利用Win7系统自身的磁盘管理功能来新建一个磁盘分区。下面好系统重装助手就来介绍一下好系统Win7系统电脑磁盘新建分区的方法…

WIn7下Ubuntu 14.04 安装

1. 在Windows下下载Ubuntu14.04的ISO镜像,解压 2. 打开wubi.exe,填写用户名,密码等相关信息,在这里需要注意的是,磁盘空间最好选到最大(30G),执行安装 3. 按照提示,重启系…

cimiss数据_CIMISS,你太优秀了!

原标题:CIMISS,你太优秀了!本周二的时候小据给大家带来了一位新朋友那便是CIMISS你真的了解它吗?一文读懂CIMISS(戳上面的链接进行回顾)今天我们继续了解一起探讨它能够为我们带来哪些好处天气业务“一站式”数据供给自2014年8月以…

python3 tkinter电子书_python3 tkinter实现添加图片和文本

本文在前面文章基础上介绍tkinter添加图片和文本,在这之前,我们需要安装一个图片库,叫Pillow,这个需要下载exe文件,根据下面图片下载和安装。下载完后直接双击安装exe,默认点击下一步,直到安装完…

序列化和反序列化实现

1. 什么是序列化? 程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入文件或是将其传输到网络中的另一台计算机上以实现通讯。这个将程序数据转换成能被存储并传输的格式的过程被称为序列化(serialization&#x…

linux source命令

source filename 与 sh filename 及./filename执行脚本的区别在那里呢?1.当shell脚本具有可执行权限时,用sh filename与./filename执行脚本是没有区别得。./filename是因为当前目录没有在PATH中,所有"."是用来表示当前目录的。2.sh…

centos7 nginx配置php7,centos7安装并配置nginx+php,centos7nginx

centos7安装并配置nginxphp,centos7nginxcentos7安装并配置nginxphp安装nginxyum install nginx设置nginx开启起动systemctl start nginx测试访问http://你的域名或IP/查看nginx安装位置whereis nginxnginx: /usr/sbin/nginx /etc/nginx /usr/share/nginx /usr/shar…

host ntrip 千寻rtk_什么是千寻知寸cors账号?它提供的定位服务精度如何?使用时需要注意哪些问题?...

千寻知寸cors账号FindCM:基于RTK技术的厘米级差分数据播发服务,终端设备收到差分数据后,结合自己的卫星观测数据进行高精度定位解算,在观测环境良好的情况下,统计精度可以达到水平2~5厘米,高程2~8厘米。由于…

python创建图片对应的csv格式_Python:如何从csv文件创建图形节点和边?

你可以用另一个COLATIC和COLATIC来建立一个COLATIC/COLATIC。然后将图“投影”到datetime节点上—如果两个datetime都链接到ColA/ColC节点,则在它们之间创建一个链接。在下面的代码展示了一种创建无向图的方法。我不明白你的例子里的指示是什么意思。在import csvim…

卡尺测量的最小范围_工厂车间里常用的测量仪器使用方法介绍,你都会用吗?...

一、测量器具的分类 测量器具是一种具有固定形态、用以复现或提供一个或多个已知量值的器具。按用途的不同量具可分为以下几类:1. 单值量具只能体现一个单一量值的量具。可用来校对和调整其它测量器具或作为标准量与被测量直接进行比较,如量块、角度量块…

codeblocks使用指南

文章目录目录创建c/c项目调试codeblocks快捷键目录 创建c/c项目 左上角File->new->project,然后在弹出的对话框中找到Console application点击Go,然后不断Next,中间的除了项目名和项目地址其他默认即可。 然后在左侧工程目录中点开main文件即可Coding了。&…

php变量 标签,html标签如何使用php中的变量

html标签中使用php变量&#xff0c;提示&#xff1a;Undefined index: uid in /var/www//list.php&#xff0c;list.php的具体代码如下&#xff1a;require redis.php;for ($i0; $i < ($redis->get("userid")) ; $i){$data[] $redis->hgetall("user:&…

Shell基础命令之echo

echo命令的功能是在显示器上显示一段文字&#xff0c;一般起到一个提示的作用。该命令的一般格式为&#xff1a; echo [ -n ] 字符串其中选项n表示输出文字后不换行&#xff1b;字符串能加引号&#xff0c;也能不加引号。用echo命令输出加引号的字符串时&#xff0c;将字符串原…

mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法

本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 &#xff0c;通过具体的内容向大家展现&#xff0c;希望对大家学习MySQL数据库有所帮助。DELIMITER $$USE qrsoft_dyj_db$$DROP PROCEDURE IF EXISTS proc_withdraw_approve$$CREATE PR…

cron 工具 每分钟_计划任务 cron和crontab

很多时候&#xff0c;我们需要定时执行某个应用或者某段脚本&#xff0c;在linux上&#xff0c;可以使用cron服务&#xff0c;它有点类似于Windows上的任务计划程序。这篇文章将简单介绍cron的使用。1. crond和crontab首先需要分清楚两个概念&#xff1a;crond和crontab。crond…

Bootstrap学习记录-2.container和table

1. Container Bootstrap中容器类提供了2个类标识&#xff1a;container、container-fluid。 两者的区别在于&#xff1a;container&#xff1a;容器不止有15px的padding&#xff0c;还有一个随着浏览器宽度变化而变化的margin。container-fluid&#xff1a;只有固定的15px的pad…

java中super用来定义父类,Java中super的几种用法及与this的区别

综观目前的 Web 应用&#xff0c;多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的 Java 实现方法&#xff0c;包括 Timer&#xff0c;Scheduler, Quartz 以及 JCron Tab&#xff0c;并对其优缺点进行比较&#xff0c;目的在于给需要开发任务调度的程序员提供有…

1001 A+B

代码链接 PDF链接 首先要说的是这道题的难点是如何把数字输出加入逗号&#xff0c;毕竟数据范围并没有超过Long。当然这个难点也不是问题&#xff0c;将数字转为字符串,C中就有这样的函数&#xff0c;然后再用 %30 这样来控制输出 。 但我最近出于想要建立自己的代码库的想法&a…

pma mysql_Table ‘phpmyadmin.pma_table_uiprefs’ doesn’t exist mysql

Error: #1146 – Table ‘phpmyadmin.pma_table_uiprefs’ doesn’t exist mysqlJust upgrade my ubuntu 14 to 15. all looks good then i go to my localhost phpmyadmin and tried to open database then found a strange error like mysql said: #1146 – Table ‘phpmyadm…

Qt字符编码,创建中文文件

1.代码文件本身编码&#xff1b; 2.Qt中用于控制读入和写出文件系统时的字符编码由QTextCodec::setCodecForLocale()所决定。一般不用设置&#xff0c;Qt跟系统交互时会根据系统的Locale来更改传给系统的参数的编码&#xff1b; //utf8格式 QString str1("你好Hello\r\…

Python 查看本机WiFi密码

http://www.lijiejie.com/python-get-all-saved-wifi-passwords/ 很早以前我写过一个&#xff0c;丢了。 今天偶然看到这篇文章 &#xff0c; 也是很久以前写的&#xff0c;他用的方法太烦了。 dos命令不是可以取本机WiFi密码吗。 #coding:utf-8 import os import re impor…

五连阳回调买入法_“4连阳+1阴”这种股票,吃透主升浪!挣得万贯家财

根据以往的个股表现情况来看&#xff0c;那些即将进入主升浪的个股具有以下几个特点&#xff1a;1、个股前期已经有了一定的涨幅&#xff0c;但向上的步伐比较谨慎&#xff0c;走势比较温和;2、股价所处的位置并不低&#xff0c;有的是一段时期以来的最高位置&#xff0c;有的甚…

java有模糊查询吗,到底Java里的模糊查询语句该怎么写

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼现在String sql"select * from car where carName like %?%";可以查询出结果了&#xff0c;但问题又来了&#xff0c;只能查询出一条结果&#xff0c;代码如下carDao.java页面public ArrayList queryAppoint(String car…

stm32的rxne和idle中断_HAL库的STM32F767的DMA通过IDLE中断接收数据但不能访问

仿真能看到接收缓冲区数组中的数据&#xff0c;但不能访问&#xff0c;如果不访问&#xff0c;再开启DMA接收能正常接收&#xff0c;并且在仿真状态下也能查看。只要访问一次这个数组&#xff0c;下一次开启DMA接收后就不能接收数据了。原代码如下&#xff1a;if(rx_end 1){rx…

使用OpenRowSet操作Excel Excel导入数据库

使用 OpenRowSet 和 OpenDataSource 访问 Excel 97-2007 测试文件&#xff1a;D:\97-2003.xls和D:\2007.xlsx&#xff0c;两个文件的内容是一模一样的。 测试环境&#xff1a;SQL Server 2000 / 2005。 ---------------------------------------------------------------------…