Greenplum表定义
GP中的table和其它关系型数据表是一样的,除了数据被分布在不同的segment以外。
在建表的时候必须申明分布键distribution policy。
建表需定义下面几个方面:
1. 指定列和数据类型
2. 约束
3. 分布策略
4. 数据存储方式
5. 大表分区策略
------选择列的数据类型------
关于字符类型,gp中CHAR、VARCHAR、TEXT在性能上没有什么差异。但其它数据库系统中char有性能优势。在大多数情况下,可以用CHAR来替代TEXT
或 VARCHAR。
关于数字类型,最好使用最小的数据类型。 用INT or SMALLINT 代替 BIGINT。
当需要跨表做join的时候,需要保证数据类型是一致。 不然的话,gp将做数据类型转换,造成性能消耗。
GP中还包含一些集合数据类型。
------约束------
兼容postgresql,包含:check、not null、unique、primary key
4.1暂不支持Foreign Key
------选择分布策略------
2种方式:
DISTRIBUTED BY (哈希分布)
DISTRIBUTED RANDOMLY(随机分布 Round-Robin)
考虑条件(重要性依次排序)
1. Even Data Distribution
为了得到最好的性能,所有segment的数据量应该是相等的。
如果出现不平衡的话,在查询的时候,数据量多的segment的负载就会很大。
2.Local and Distributed Operations
要做join、sort或aggregation的操作的话,segment-level(segment内部)比system-level(segment之间)要快。
3. Even Query Processing
每个Segment都获得相等的查询请求负载
------表存储方式------
1. Heap 或
Append-Only存储
GP默认使用堆表。堆表最好用在小表,如:维表(初始化后经常更新)
Append-Only表不能update和delete。一般用来做批量数据导入。 不建议单行插入。
如:
=> CREATE TABLE bar (a int, b text)
WITH (appendonly=true)
DISTRIBUTED BY (a);
2. Row 或 Column-Oriented
存储
GP提供存储模式:
行存储、列存储、混合存储
使用情景说明:
a.数据需要更新
行存储 => 表数据被导入后,如果需要更新的话
列存储 => 只适合append-only表。
b.经常插入数据
行存储 => 如果频繁插入数据
列存储 => 对于写操作没有做优化
(同一行的列值必须写到磁盘的不同位置)
c.多列查询请求
行存储 => 在select或where子句中,查询所有列或大部分列
列存储 => 在where或having子句中,查询单列的值汇总或单行过滤
如: SELECT AVG(salary)... WHERE salary > 10000
SELECT salary, dept ... WHERE state='CA'
d.表中许多列
行存储 => 同一次请求很多列 或 行数据大小相对较小
列存储 => 使用宽表,查询时候仅仅查少数列
e.压缩
行存储 => 不可用
列存储 => 可用
如:(注: 使用列存储必须是append-only表)
=> CREATE TABLE bar (a int, b text)
WITH (appendonly=true, orientation=column)
DISTRIBUTED BY (a);
3. 使用压缩 (Append-Only表才适用)
可以数据库内置的压缩(zlib 或
QuickLZ)。如果使用了已压缩的文件系统,建append-only表将不能使用压缩功能。
在选择append-only表的压缩类型和级别的时候需考虑一下因素:
@ CPU的使用率
@ 压缩率/磁盘大小
@ 压缩速率
@ 解压速率/扫描速率
尽管我们为了减少数据容量大小而使用压缩功能,但是我们必须考虑到数据在压缩与解压的过程中的时间和cpu的消耗。
压缩的性能取决于硬件、查询调优设置、其它因素。
QuickLZ -
低压缩率、低cpu消耗、压缩数据块
zlib - 高压缩率、低速
示例:=> CREATE
TABLE foo (a int, b text)
WITH (appendonly=true, compresstype=zlib,
compresslevel=5);
(注:
QuickLZ的压缩级别只有level1,zlib能够设置从1-9)

(压缩相关函数)
------修改表结构------
Alter
Table修改内容:列定义、分布原则、存储模式、分区结构...等等
具体可以参考官方文档
------删除表------
DROP TABLE mytable;
同时删除相关index、rule、trigger和contraints。
如果要删除相关的view的话,需要加 CASCADE
------清空表------
DELETE FROM
mytable;
TRUNCATE mytable;
引用:http://blog.sina.com.cn/s/blog_90474a9201013gyz.html
Greenplum表定义的更多相关文章
- MySQL表定义缓存
表定义 MySQL的表包含表名,表空间.索引.列.约束等信息,这些表的元数据我们暂且称为表定义信息. 对于InnoDB来说,MySQL在server层和engine层都有表定义信息.server层的表 ...
- (转载)根据数据字典表定义的表结构,生成创建表的SQL语句
<来源网址:http://www.delphifans.com/infoview/Article_221.html>根据数据字典表定义的表结构,生成创建表的SQL语句 //1. 类名:T ...
- hbase源码系列(四)数据模型-表定义和列族定义的具体含义
hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本],物理模型是基于列族的.但实际情况是啥?还是上点代码吧. HTableDe ...
- OGG_GoldenGate数据表定义方式DEFGEN(案例)
2014-03-09 Created By BaoXinjian
- hbase shell-ddl(表定义指令)
hbase表定义指令详细解说篇 1. alter, alter_async, alter_status 2. create 3. describe (可以简写成'desc') 显示某张表的结构情况 ...
- MySQL的表定义语法
表定义 只有成功创建数据库后,才能创建数据表,数据表是字段的集合,在表中数据按行和列的格式存储 创建表 MySQL 使用 CREATE TABLE 创建表.其中有多个选择,主要由表创建定义(creat ...
- 十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义
摘要:表结构设计是数据库建模的一个关键环节,表定义好坏直接决定了集群的有效容量以及业务查询性能,本文从产品架构.功能实现以及业务特征的角度阐述在GaussDB(DWS)的中表定义时需要关注的一些关键因 ...
- Oracle cmd 导出数据库或者表定义或者纯数据
实例: expdp zypacs/Sfx371482@zyrisdb schemas=ZYPACS content=metadata_only CONTENT={ALL | DATA_ONLY | M ...
- greenplum表的distributed key值查看
greenplum属于分布式的数据库,MPP+Share nothing的体系,查询的效率很快.不过,这是建立在数据分散均匀的基础上的.如果DK值设置不合理的话,完全有可能出现所有数据落在单个节点上的 ...
随机推荐
- 使用Docker、CoreOS、Mesos部署可扩展的Web应用
[编者的话]本文作者重点介绍了如何使用Docker.CoreOS.Mesos.Vulcand.对象存储来部署一个可扩展的Web应用,他首先介绍了为什么要选择这些工具以及与其它工具相比这些工具的优势.紧 ...
- Jenkins pipeline中使用内置全局变量
在pipeline中不像在windows batch command中直接%WORKSPACE%这样 需要写成这样: echo env.WORKSPACE
- Bootstrap变形记
bootstrap审美疲劳了,想个招换换样子,THINKING... 变形 >>> 哈,不用改已有代码,添加我的Harley.js即可,有空在玩... 真实好久不玩博客园了,200字 ...
- 总结目前为止学到的关键字(break,continue,private,static,this,super,final,abstract)
1.控制跳转语句:break(结束) 使用的场景: a.循环当中 b.switch break关键字需要注意的问题: 1.break关键字只能用于循环和switch语句当中,其本质就是结束整段语句的意 ...
- std::shared_ptr之deleter的巧妙应用
本文由作者邹启文授权网易云社区发布. std::shared_ptr 一次创建,多处共享,通过引用计数控制生命周期. 实例 在邮箱大师PC版中,我们在实现搜索时,大致思路是这样的: 每一个账号都有一个 ...
- python网络编程--线程的方法,线程池
一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...
- php—Smarty-缓存1(25)
一. 缓存原理: IE:将资源文件保存至本地 Smarty:将缓存保存到服务器 编译 < 缓存 < 静 ...
- Java中运算符“|”和“||”以及“&”和“&&”区别
1.“|”运算符:不论运算符左侧为true还是false,右侧语句都会进行判断,下面代码 int a =1,b=1; if(a++ == 1 | ++b == 2) System.out.printl ...
- 使用git提交代码流程
一.拉取最新代码 一般在本地进行开发时,都是切换到自己的dev分支进行开发,当开发完成需要进行代码提交,在进行代码提交前需要先进行拉取远程仓库代码,进行更新,但是此时会提示需要将本地代码进行commi ...
- 聊聊Postgres中的IPC之SI Message Queue
在 PostgreSQL中,每一个进程都有属于自己的共享缓存(shared cache).例如,同一个系统表在不同的进程中都有对应的Cache来缓存它的元组(对于RelCache来说缓存的是一个Rel ...