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

原文地址:https://www.cnblogs.com/Java-Starter/p/9907620.html

时间: 2024-10-14 06:18:58

Greenplum表定义的相关文章

函数WS_UPLOAD 功能﹕将TXT文件转换成SAP中的内表定义的数据表格文件

1 . 函数WS_UPLOAD      功能﹕将TXT文件转换成SAP中的内表定义的数据表格文件     注意﹕1 函数将按参数 data_tab 的实际参数(假设为 table1) table1 定                                                                              义的各个字段的长度来依次将TXT文件间隔开﹐并依次将对应的值付给table1的             字段,table中的各个字段必须为C

SQL插入错误: 列名或所提供值的数目与表定义不匹配。

当你后端编程使用框架与数据库连接时出现”列名或所提供值的数目与表定义不匹配“的异常信息时如果确认你设计的列名和列的数值跟SQL server列名一样时,这时的错误就会可能是因为你涉及数据库新建表格时采用的是默认属性导致. 解决办法 1.打开数据库表格设计选项 2.点击数据类型下面自己设计的数据 3.列属性有一项是否全文本规范修改一下是该为否,测试一下是否还有此类BUG

MySQL的表定义语法

表定义 只有成功创建数据库后,才能创建数据表,数据表是字段的集合,在表中数据按行和列的格式存储 创建表 MySQL 使用 CREATE TABLE 创建表.其中有多个选择,主要由表创建定义(create definition).表选项定义(table options) 和区分选项(partition options)等内容构成. 表创建定义:由表列的名字.列的定义集可能的一个空值声明.一个完整性约束或表索引项组成,表索引项主要定义表的索引.主键.外键等. 语法结构: CREATE[TEMPORA

08、顺序表定义

顺序表的定义 一.顺序表的静态存储分配 #define maxSize 100 //显式地定义表的长度 typedef int DataType; //定义表元素的数据类型 typedef struct //顺序表的定义 { DataType data[maxSize]; //静态分配存储表元素的向量 int n; //实际表元素个数 }SeqList; 二.顺序表的动态存储分配 #define initSize 100 //表长度的初始化 typedef int Datatype; //定义表

mysql 之表定义操作

1.创建数据库 create database lush; 2.删除数据库 drop database lush; 3.选择数据库 use lush; 4.创建用户 grant all on *.* to 'lush'@'%' identified by '123456'; 5.创建表 create table zhu(id int,name varchar(20)); 删除表 drop table zhu; 6.查看表结构 desc zhu; 7.插入数据 insert into zhu va

SQL: DDL, DML,表定义与含义

DDL: 数据定义语言:CREATE, ALTER, DROP DB组件:数据库.表.索引.视图.用户.存储过程.存储函数.触发器.事件调度器等 CREATE相关的常用命令: CREATE DATABASE CREATE EVENT CREATE FUNCTION CREATE FUNCTION UDF CREATE INDEX CREATE PROCEDURE CREATE SERVER CREATE TABLE CREATE TABLESPACE CREATE TRIGGER CREATE

15.表结构修改-修改表定义和表名

修改列定义和表名 修改列定义 ALTER  TABLE  S MODIFY  type TINYINT  UNSIGNED  NOT NULL;(modify是调整 稍作修改的意思,UNSIGNED表示是无符号的,是一个正数如果直接不用UNSIGNED,那int可以是正数负数和零) 演示: 修改表字段 --type(字段名称)  数据类型:tinyint(小整型) 默认是1 将type int ,默认值为2 ALETER TABLE member MODIFY  type  INT UNSIGN

MYSQL 查看表定义的 3 种方法

方法 1. show create table table_name;可以用这个看表的代码. show create table Strings; 方法 2. show full columns from table_name; show full columns from Strings; 方法 3. show columns from table_name; show columns from Strings;

SQL Server 查看表定义的 2 种方法

方法 1. 用SQL Server Management Studio 第一步找到要查看的表,右键 第二步点设计 方法 2. sp_help @objname = 'tableName' execute sp_help @objname = 'Nums';