我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Greenplum怎么创建表的分布键

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Greenplum怎么创建表的分布键

本篇内容介绍了“Greenplum怎么创建表的分布键”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Greenplum创建表--分布键

Greenplum是分布式系统,创建表时需要指定分布键(创建表需要CREATEDBA权限),目的在于将数据平均分布到各个segment。选择分布键非常重要,选择错了会导致数据不唯一,更严重的是会造成SQL性能急剧下降。


Greenplum有两种分布策略:

1、hash分布。

Greenplum默认使用hash分布策略。该策略可选一个或者多个列作为分布键(distribution key,简称DK)。分布键做hash算法来确认数据存放到对应的segment上。相同分布键值会hash到相同的segment上。表上最好有唯一键或者主键,这样能保证数据均衡分不到各个segment上。语法,distributed by。

如果没有主键或者唯一键,默认选择第一列作为分布键。增加主键


2、随机(randomly)分布。

数据会被随机分不到segment上,相同记录可能会存放在不同的segment上。随机分布可以保证数据平均,但是Greenplum没有跨节点的唯一键约束数据,所以无法保证数据唯一。基于唯一性和性能考虑,推荐使用hash分布,性能部分会另开一篇文档详细介绍。语法,distributed randomly。

一、hash分布键

创建表,未指定分布列、分布类型,默认创建hash分布表,把第一列ID字段作为了分布键。

testDB=# create table t_hash(id int,name varchar(50)) distributed by (id);

CREATE TABLE

testDB=# 

 

testDB=# \d t_hash

           Table "public.t_hash"

 Column |         Type          | Modifiers 

--------+-----------------------+-----------

 id     | integer               | 

 name   | character varying(50) | 

Distributed by: (id)

 

添加主键后,主键升级为分布键替代了id列。

testDB=# alter table t_hash add primary key (name);

NOTICE:  updating distribution policy to match new primary key

NOTICE:  ALTER TABLE / ADD PRIMARY KEY will create implicit index "t_hash_pkey" for table "t_hash"

 

ALTER TABLE

testDB=# \d t_hash

           Table "public.t_hash"

 Column |         Type          | Modifiers 

--------+-----------------------+-----------

 id     | integer               | 

 name   | character varying(50) | not null

Indexes:

    "t_hash_pkey" PRIMARY KEY, btree (name)

Distributed by: (name)

 

验证hash分布表可实现主键或者唯一键值的唯一性

testDB=# insert into t_hash values(1,'szlsd1');

INSERT 0 1

testDB=#

testDB=# insert into t_hash values(2,'szlsd1');

ERROR:  duplicate key violates unique constraint "t_hash_pkey"(seg2 gp-s3:40000 pid=3855)

另外,主键列上依然能够创建唯一键

testDB=# create unique index u_id on t_hash(name);

CREATE INDEX

testDB=#

testDB=#

testDB=# \d t_hash

           Table "public.t_hash"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Indexes:

    "t_hash_pkey" PRIMARY KEY, btree (name)

    "u_id" UNIQUE, btree (name)

Distributed by: (name)

但是,非主键列无法单独创建唯一索引,想创建的话必须包含多有分布键列

testDB=#  create unique index uk_id on t_hash(id);

ERROR:  UNIQUE index must contain all columns in the distribution key of relation "t_hash"

testDB=#  create unique index uk_id on t_hash(id,name);

CREATE INDEX

testDB=# \d t_hash

           Table "public.t_hash"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Indexes:

    "t_hash_pkey" PRIMARY KEY, btree (name)

    "uk_id" UNIQUE, btree (id, name)

Distributed by: (name)

删除主键后,原hash分布键依然不变。

testDB=# alter table t_hash drop constraint t_hash_pkey;

ALTER TABLE

testDB=# \d t_hash

           Table "public.t_hash"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Distributed by: (name)

当分布键不是主键或者唯一键时,我们来验证分布键的相同值落在一个segment的结论。

下面的实验,name列是分布键,我们插入相同的name值,可以看到7条记录都落在了2号segment节点中。

testDB=#  insert into t_hash values(1,'szlsd');

INSERT 0 1

testDB=#  insert into t_hash values(2,'szlsd');

INSERT 0 1

testDB=#  insert into t_hash values(3,'szlsd');

INSERT 0 1

testDB=#  insert into t_hash values(4,'szlsd');

INSERT 0 1

testDB=#  insert into t_hash values(5,'szlsd');

INSERT 0 1

testDB=#  insert into t_hash values(6,'szlsd');

INSERT 0 1

testDB=#

testDB=#

testDB=# select gp_segment_id,count(*) from t_hash group by gp_segment_id; 

 gp_segment_id | count

---------------+-------

             2 |     7

(1 row)

二、随机分布键

创建随机分布表需加distributed randomly关键字,具体使用哪列作为分布键不得而知。


testDB=# create table t_random(id int ,name varchar(100)) distributed randomly;

CREATE TABLE

testDB=#

testDB=#

testDB=# \d t_random

           Table "public.t_random"

 Column |          Type          | Modifiers

--------+------------------------+-----------

 id     | integer                |

 name   | character varying(100) |

Distributed randomly

验证主键/唯一键的唯一性,可以看到随机分布表不能创建主键和唯一键

testDB=# alter table t_random add primary key (id,name);

ERROR:  PRIMARY KEY and DISTRIBUTED RANDOMLY are incompatible

testDB=#

testDB=# create unique index uk_r_id on t_random(id);

ERROR:  UNIQUE and DISTRIBUTED RANDOMLY are incompatible

testDB=#

从实验中可以看出无法实现数据的唯一性。并且,数据插入随机分布表,并不是轮询插入,实验中共有3个segment,但是在1号插入3条记录,在2号segment节点插入2条记录后,才在0号segment中插入数据。随机分布表如何实现数据平均分配不得而知。这个实验也验证了随机分布表的相同值分布在不同segment的结论。

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             1 |     1

(1 row)

 

testDB=#

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             2 |     1

             1 |     1

(2 rows)

 

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             2 |     1

             1 |     2

(2 rows)

 

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             2 |     2

             1 |     2

(2 rows)

 

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             2 |     2

             1 |     3

(2 rows)

 

testDB=# insert into t_random values(1,'szlsd3');

INSERT 0 1

testDB=# select gp_segment_id,count(*) from t_random group by gp_segment_id;

 gp_segment_id | count

---------------+-------

             2 |     2

             1 |     3

             0 |     1

(3 rows)

三、CTAS继承原表分布键

Greenplum中有两种CTAS语法,无论哪种语法,都默认继承原表的分布键。但是,不会继承表的一些特殊属性,如主键、唯一键、APPENDONLY、COMPRESSTYPE(压缩)等。

testDB=# \d t_hash;

           Table "public.t_hash"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Indexes:

    "t_hash_pkey" PRIMARY KEY, btree (name)

    "uk_id" UNIQUE, btree (id, name)

Distributed by: (name)

 

testDB=#

testDB=#

testDB=# create table t_hash_1 as select * from t_hash;

NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column(s) named 'name' as the Greenplum Database data distribution key for this table.

HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.

SELECT 0

testDB=# \d t_hash_1

          Table "public.t_hash_1"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) |

Distributed by: (name)

 

testDB=#

testDB=# create table t_hash_2 (like t_hash);

NOTICE:  Table doesn't have 'distributed by' clause, defaulting to distribution columns from LIKE table

CREATE TABLE

testDB=# \d t_hash_2

          Table "public.t_hash_2"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Distributed by: (name)

如果CTAS创建表改变分布键,加上distributed by即可。

testDB=# create table t_hash_3 as select * from t_hash distributed by (id);

SELECT 0

testDB=#

testDB=# \d t_hash_3

          Table "public.t_hash_3"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) |

Distributed by: (id)

 

testDB=#

testDB=#

testDB=# create table t_hash_4 (like t_hash) distributed by (id);

CREATE TABLE

testDB=#

testDB=# \d t_hash5

Did not find any relation named "t_hash5".

testDB=# \d t_hash_4

          Table "public.t_hash_4"

 Column |         Type          | Modifiers

--------+-----------------------+-----------

 id     | integer               |

 name   | character varying(50) | not null

Distributed by: (id)

CTAS时,randomly随机分布键要特别注意,一定要加上distributed randomly,不然原表是hash分布键,CTAS新表则是随机分布键。

testDB=# \d t_random

           Table "public.t_random"

 Column |          Type          | Modifiers

--------+------------------------+-----------

 id     | integer                |

 name   | character varying(100) |

Distributed randomly

 

testDB=#

testDB=# \d t_random_1

          Table "public.t_random_1"

 Column |          Type          | Modifiers

--------+------------------------+-----------

 id     | integer                |

 name   | character varying(100) |

Distributed by: (id)

testDB=# create table t_random_2 as select * from t_random distributed randomly;

SELECT 7

testDB=#

testDB=# \d t_random_2

          Table "public.t_random_2"

 Column |          Type          | Modifiers

--------+------------------------+-----------

 id     | integer                |

 name   | character varying(100) |

Distributed randomly

“Greenplum怎么创建表的分布键”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Greenplum怎么创建表的分布键

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

mysql创建表外键怎么写

在 mysql 中,可通过以下步骤创建表外键:创建父表和子表,并确保父表存在相应列。使用 foreign key 约束将子表中的列与父表中的列关联。可选地指定级联操作,定义删除或更新父表记录时对子表记录的影响。运行查询检查外键约束是否已正确
mysql创建表外键怎么写
2024-04-22

plsql怎么创建表设置主键

在PL/SQL中创建表并设置主键,可以使用CREATE TABLE语句和ALTER TABLE语句。以下是一个示例:1、创建表并设置主键:CREATE TABLE employees (employee_id NUMBER PRIMAR
plsql怎么创建表设置主键
2024-04-09

oracle怎么创建表外键约束

要在Oracle数据库中创建表外键约束,可以使用以下语法:ALTER TABLE child_tableADD CONSTRAINT fk_constraint_nameFOREIGN KEY (child_column)REFER
oracle怎么创建表外键约束
2024-03-13

mysql创建表时怎么添加外键

在MySQL中添加外键时,需要使用FOREIGN KEY关键字来指定外键约束。以下是一个示例创建表并添加外键的SQL语句:CREATE TABLE table1 (id INT PRIMARY KEY,name VARCHAR(50))
mysql创建表时怎么添加外键
2024-04-09

mysql创建表时怎么设置外键

在MySQL中,设置外键需要使用FOREIGN KEY关键字。首先,需要确保两个表都已经创建。然后,在创建表时,可以在列的定义中使用FOREIGN KEY关键字来设置外键。以下是一个示例,展示如何创建一个包含外键的表:CREATE TABL
2023-09-26

mysql创建表外键约束怎么写

在 mysql 中创建表外键约束可确保参照完整性。步骤如下:创建两个表并指定主键。在子表中添加 foreign key 约束,引用父表的主键。可选择指定引用操作(例如级联删除或限制更新)。在 MySQL 中创建表外键约束当两个表之间建立外
mysql创建表外键约束怎么写
2024-04-22

oracle怎么创建列表分区

要在Oracle中创建列表分区,可以按照以下步骤进行操作:1. 首先,确保你有创建分区的权限。如果没有,可以联系数据库管理员进行授权。2. 确定要分区的表。假设我们要在一个名为"employees"的表上创建列表分区。3. 选择一个适合作为
2023-08-18

oracle怎么创建主键指定表空间

要在Oracle中创建一个主键并指定表空间,可以使用以下语法:CREATE TABLESPACE tbs_example DATAFILE 'tbs_example.dbf' SIZE 100MEXTENT MANAG
oracle怎么创建主键指定表空间
2024-04-09

mysql创建表怎么设置外键关联

在MySQL中,可以通过在创建表时使用FOREIGN KEY关键字来设置外键关联。下面是一个示例:```sqlCREATE TABLE 表名 (列1 数据类型,列2 数据类型,...FOREIGN KEY (列1) REFERENCES 另
2023-08-30

PostgreSQL怎么创建分区表详解

目录前言列分区表范围分区表总结前言PG 假如我们想像Hive那也创www.cppcns.com建动态分区是不能实现的。 那么需要我们手动通过脚本来创建分区表,创建分区表必须要创建主表和分区表。因此我们可以根据我们需求提前
2022-06-23

oracle怎么在已有表上创建分区

要在已有的表上创建分区,需要使用ALTER TABLE语句并指定分区关键字。以下是一个示例:ALTER TABLE table_nameMODIFYPARTITION BY RANGE (column_name)(PARTITION p
oracle怎么在已有表上创建分区
2024-04-09

pycharm怎么实现创建表格_pycharm实现创建表格的方法

首先打开pycharm工具。再点击file,创建python项目。导入python的docx库。接着创建document对象。再创建table表格。最后用text向表格输入数据。以上就是pycharm怎么实现创建表格_pycharm实现创
pycharm怎么实现创建表格_pycharm实现创建表格的方法
2024-05-10

编程热搜

目录