人大金仓分析型数据库使用之选择表存储模型

目录

前言

一、堆存储

二、追加优化存储

三、行或列存储

 四、修改一个表

1、修改表的分布

2、更改分布策略

3、重新分布表的数据

五、删除一个表


前言

        数据库支持多种存储模型和一种混合存储模型。 当用户创建一个表时,用户会选择如何存储它的数据。

一、堆存储

         堆表存储在 OLTP 类型负载下表现最好,这种环境中数据会在初始载入后被频繁地修改。 UPDATE DELETE 操作要求存储行级版本信息来确保可靠的数据库事务处理。 堆表最适合于较小的表,例如维度表,它们在初始载入数据后会经常被更新。        

二、追加优化存储

        追加优化表存储在数据仓库环境中的非规范表表现最好。 非规范表通常是系统中最大的表。 事实表通常成批地被载入并且被只读查询访问。 将大型的事实表改为追加优化存储模型可以消除每行中的更新可见性信息负担,这可以为每一行节约大概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);
在一个可重复读或可序列化事务中的追加优化表上不允 许UPDATE DELETE ,它们将导致该事务中止。 追加优化表上不支持CLUSTER DECLARE...FOR UPDATE 和触发器。

三、行或列存储

        数据库提供面向存储的模型选择:行,列或两者的组合。
  • 面向行的存储:适用于具有许多迭代事务的 OLTP 类型的工作负载以及一次需要多列的单行,因此检索是高效的
  • 面向列的存储:适合于在少量列上计算数据聚集的数据仓库负载,或者是用于需要对单列定期更新但不修改其他列数据的情况

        对于大部分常用目的或者混合负载,面向行的存储提供了灵活性和性能的最佳组合。 不过,也有场景中面向列的存储模型提供了更高效的I/O和存储。 在为一个表决定存储方向模型时,请考虑下列需求:

  • 表数据的更新。表如果用户会频繁地装载和更新表数据,请选择一个面向行的堆表。面向列的表存储只能用于追加优化表
  • 压缩。 列数据具有相同的数据类型,因此在列存数据上支持存储尺寸优化, 但在行存数据上则不支持。 例如,很多压缩方案使用临近数据的相似性来进行压缩。 不过,临近压缩做得越好,随机访问就会越困难,因为必须解压数据才能读取它们。
  • 表中的列数。 在同时要求很多列或者表的行尺寸相对较小时,面向行的存储会更有效。 对于具有很多列的表且查询中访问这些列的一个小子集时,面向列的表能够提供更好的查询性能
  • 查询中要求的列数。 如果在查询的SELECT列表或者 WHERE 子句中常常要求所有或者大部分列,请考虑面向行的模型。 面向列的表最适合的情况是,查询会聚集一个单一列中的很多值且WHERE 或者 HAVING 谓词也在该聚集列上
  • 频繁的插入。如果频繁地向表中插入行,请考虑面向行的模型。 列存表并未 对写操作优化,因为一行的列值必须被写到磁盘上的不同位置

         CREATE TABLE命令的WITH子句指定表的存储选项。 默认是面向行的堆表。使用面向列的存储的表必须是追加优化表。例如,创建一个面向列的表:

=> CREATE TABLE bar (a int, b text)
WITH (appendoptimized=true, orientation=column)
DISTRIBUTED BY (a);

 四、修改一个表

        ALTER TABLE命令改变一个表的定义。 使用ALTER TABLE可以更改表的属性,例如列定义、分布策略、存储模型以及分区结构

1、修改表的分布

        ALTER TABLE提供了选项来改变一个表的分布策略。 当表分布选项改变时,表数据会被在磁盘上重新分布,这可能会造成资源紧张。 用户也可以使用现有的分布策略重新分布表数据。

2、更改分布策略

        对于已分区的表,对于分布策略的更改会递归地应用到子分区上。 这种操作会保留拥有关系和该表的所有其他属性。 例如,下列命令使用customer_id列作为分布键在所有实例之间重新分布表sales

ALTER TABLE sales SET DISTRIBUTED BY (customer_id);

        在用户改变一个表的哈希分布时,表数据会被自动重新分布。 把分布策略改成随机分布不会导致数据被重新分布。 例如,下面的ALTER TABLE命令不会立刻产生效果:

ALTER TABLE sales SET DISTRIBUTED RANDOMLY;
将表的分布策略更改为 DISTRIBUTED REPLICATED 或从 DISTRIBUTED  REPLICATED 修改为其他分布,会自动重新分配表数据。

3、重新分布表的数据

        要用一种随机分布策略(或者当哈希分布策略没有被更改时)对表重新分布数据,可使用REORGANIZE=TRUE。 重新组织数据对于改善一个数据倾斜问题是必要的,当系统中增加了实例资源后也需要重新组织数据。 例如,下面的命令会使用当前的分布策略(包括随机分布)在所有实例上重新分布数据。

ALTER TABLE sales SET WITH (REORGANIZE=TRUE);
将表的分布策略更改为 DISTRIBUTED REPLICATED 或从 DISTRIBUTED REPLICATED 改为其它总是重新分配表数据, 即使REORGANIZE=FALSE 也是如此。

五、删除一个表

        DROP TABLE命令把表从数据库中移除。例如:

DROP TABLE mytable;
        要清空一个表的行但不移除该表的定义,可使用DELETE 或者 TRUNCATE 。例如:
DELETE FROM mytable;
TRUNCATE mytable;
DROP TABLE 总是会移除目标表上存在的任何索引、规则、触发器和约束。 删除一个被视图引用的表应指定CASCADE CASCADE 会移除依赖表的视图。

你可能感兴趣的:(数据库)