Greenplum数据库的表与任何一种关系型数据库中的表类似,不过其表中的行被分布在系统中的不同Segment上。当用户创建一个表时,用户会指定该表的分布策略。
CREATE TABLE命令创建一个表并且定义它的结果。当用户创建一个表示,用户需要定义:
一个列的数据类型决定了该列能包含的数据的类型。选择的数据类型应使用最少的空间,但仍能容纳用户的数据并且能最好地约束数据。例如,对字符串使用character数据类型,对于日期使用date或者timestamp数据类型,而对数字使用numeric数据类型。
对于包含文本数据的表列,应指定数据类型为 VARCHAR或者TEXT。不推荐指定数据类型为 CHAR。在Greenplum数据库中数据类型 VARCHAR或者TEXT会把增加到数据的填充(在最后一个非空白字符后面增加的空白字符)处理为有效字符,而数据类型CHAR不会这样做。关于character数据类型的信息,请见 Greenplum数据库参考指南中的CREATE TABLE命令。
使用能容纳用户的数字型数据的且允许未来扩张的最小数字数据类型。例如,为适合INT or SMALLINT的数据使用BIGINT会浪费存储空间。如果用户预期用户的数据值将会随着时间扩张,应该考虑到在装载大量数据后从较小的数据类型更改成较大的数据类型需要很大的代价。例如,如果用户当期的数据值适合SMALLINT,但是很可能值会扩张,这样INT就是更好的长期选择。
对用户计划要用在交叉表连接中的列使用相同的数据类型。交叉表连接通常使用一个表中的主键和其他表中的外键。当数据类型不同时,数据库必须转换其中之一以便数据值能被正确地比较,这会增加不必要的开销。
Greenplum数据库为用户提供了丰富的本地数据类型集合。有关内建数据类型的信息请见Greenplum数据库参考指南。
用户可以在列和表上定义约束来限制表中的数据。Greenplum数据库支持和PostgreSQL相同的约束,但是有一些限制,包括:
检查约束允许用户指定一个特定列中的值必须满足一个布尔(真值)表达式。例如,要求正的产品价格:
=> CREATE TABLE products
( product_no integer,
name text,
price numeric CHECK (price > 0) );
非空约束指定一个列不能有空值。非空约束总是被写作为列约束。例如:
=> CREATE TABLE products
( product_no integer NOT NULL,
name text NOT NULL,
price numeric );
唯一约束确保一列或者一组列中包含的数据对于表中所有的行都是唯一的。该表必须是哈希分布(非DISTRIBUTED RANDOMLY)的,并且约束列必须是该表的分布键列(或者是一个超集)。例如:
=> CREATE TABLE products
( product_no integer UNIQUE,
name text,
price numeric)
DISTRIBUTED BY (product_no);
主键约束是一个UNIQUE约束和一个 NOT NULL约束的组合。该表必须是哈希分布(非DISTRIBUTED RANDOMLY)的,并且约束列必须是该表的分布键列(或者是一个超集)。如果一个表具有主键,这个列(或者这一组列)会被默认选中为该表的分布键。例如:
=> CREATE TABLE products
( product_no integer PRIMARY KEY,
name text,
price numeric)
DISTRIBUTED BY (product_no);
不支持外键。用户可以声明它们,但是参照完整性不会被实施。
外键约束指定一列或者一组列中的值必须匹配出现在另一个表的某行中的值,以此来维护两个相关表之间的参照完整性。参照完整性检查不能在一个Greenplum数据库的分布表段之间实施。
所有的Greenplum数据库表都会被分布。当用户创建或者修改一个表时,用户可以有选择地指定DISTRIBUTED BY(哈希分布)或者 DISTRIBUTED RANDOMLY(循环分布)来决定该表的行分布。
注意:如果创建表时没有指定DISTRIBUTED BY,Greenplum数据库服务器配置参数 gp_create_table_random_default_distribution控制表的分布策略。
更多有关该参数的信息,请见Greenplum数据库参考指南的“服务器配置参数”部分。
在决定表分布策略时,请考虑以下几点。
CREATE TABLE的可选子句DISTRIBUTED BY和DISTRIBUTED RANDOMLY指定一个表的分布策略。默认是使用PRIMARY KEY(如果表有主键)或者表的第一个列作为分布键的哈希分布策略。几何或者用户定义数据类型的列不能作为Greenplum分布键列。如果一个表没有符合要求的列,Greenplum会以随机或者循环方式分布行。
为了确保数据的均匀分布,应该选择对每个记录都唯一的分布键。如果做不到,可选择DISTRIBUTED RANDOMLY。例如:
=> CREATE TABLE products
(name varchar(40),
prod_id integer,
supplier_id integer)
DISTRIBUTED BY (prod_id);
=> CREATE TABLE random_stuff
(things text,
doodads text,
etc text)
DISTRIBUTED RANDOMLY;
重要:主键总是表的分布键。如果不存在主键,但是存在唯一键,那么唯一键就是该表的分布键。
评论区(0)