目录
前言
一、堆存储
二、追加优化存储
三、行或列存储
四、修改一个表
1、修改表的分布
2、更改分布策略
3、重新分布表的数据
五、删除一个表
追加优化表存储在数据仓库环境中的非规范表表现最好。 非规范表通常是系统中最大的表。 事实表通常成批地被载入并且被只读查询访问。 将大型的事实表改为追加优化存储模型可以消除每行中的更新可见性信息负担,这可以为每一行节约大概20字节。 这可以得到一种更加简洁并且更容易优化的页面结构。 追加优化表的存储模型是为批量数据装载优化的,因此不推荐单行的INSERT语句。
创建一个堆表,面向行的堆表是默认的存储类型:
=> CREATE TABLE foo (a int, b text) DISTRIBUTED BY (a);
使用CREATE TABLE命令的WITH子句可以声明表的存储选项。 默认是将表创建为面向行的堆存储表。 例如,要创建一个不压缩的追加优化表:
=> CREATE TABLE bar (a int, b text)
WITH (appendoptimized=true)
DISTRIBUTED BY (a);
对于大部分常用目的或者混合负载,面向行的存储提供了灵活性和性能的最佳组合。 不过,也有场景中面向列的存储模型提供了更高效的I/O和存储。 在为一个表决定存储方向模型时,请考虑下列需求:
CREATE TABLE命令的WITH子句指定表的存储选项。 默认是面向行的堆表。使用面向列的存储的表必须是追加优化表。例如,创建一个面向列的表:
=> CREATE TABLE bar (a int, b text)
WITH (appendoptimized=true, orientation=column)
DISTRIBUTED BY (a);
ALTER TABLE命令改变一个表的定义。 使用ALTER TABLE可以更改表的属性,例如列定义、分布策略、存储模型以及分区结构。
ALTER TABLE提供了选项来改变一个表的分布策略。 当表分布选项改变时,表数据会被在磁盘上重新分布,这可能会造成资源紧张。 用户也可以使用现有的分布策略重新分布表数据。
对于已分区的表,对于分布策略的更改会递归地应用到子分区上。 这种操作会保留拥有关系和该表的所有其他属性。 例如,下列命令使用customer_id列作为分布键在所有实例之间重新分布表sales:
ALTER TABLE sales SET DISTRIBUTED BY (customer_id);
在用户改变一个表的哈希分布时,表数据会被自动重新分布。 把分布策略改成随机分布不会导致数据被重新分布。 例如,下面的ALTER TABLE命令不会立刻产生效果:
ALTER TABLE sales SET DISTRIBUTED RANDOMLY;
要用一种随机分布策略(或者当哈希分布策略没有被更改时)对表重新分布数据,可使用REORGANIZE=TRUE。 重新组织数据对于改善一个数据倾斜问题是必要的,当系统中增加了实例资源后也需要重新组织数据。 例如,下面的命令会使用当前的分布策略(包括随机分布)在所有实例上重新分布数据。
ALTER TABLE sales SET WITH (REORGANIZE=TRUE);
DROP TABLE命令把表从数据库中移除。例如:
DROP TABLE mytable;
DELETE FROM mytable;
TRUNCATE mytable;