更新时间:2024-10-10 GMT+08:00

选择GaussDB(DWS)表存储模型

GaussDB(DWS)支持行列混合存储。当创建一个表时,可以选择表的存储格式为行存储或列存储。

行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。默认情况下,创建的表为行存储。行存储和列存储的差异请参见图1

图1 行存储和列存储的差异

上图中,左上为行存表,右上为行存表在硬盘上的存储方式。左下为列存表,右下为列存表在硬盘上的存储方式。

GaussDB(DWS)表的行/列存储通过表定义的orientation属性定义。当指定orientation属性为row时,表为行存储;当指定orientation属性为column时,表为列存储;如果不指定,默认为行存储。行、列存储模型各有优劣,建议根据实际情况选择:

表1 表的存储类型及场景

存储模型

优点

缺点

适用场景

行存

数据按照行进行存储,在查询某一行数据时,可以快速定位到目标位置。

查询时即使只涉及某几列,所有数据也都会被读取。

  1. 表的字段个数比较少,查询表的大部分字段。
  2. 点查询(返回记录少,基于索引的简单查询)。
  3. 频繁进行增删改查操作且该涉及整行数据。

列存

  1. 查询时只有涉及到的列会被读取。
  2. 列数据特征比较相似,能够更有效地进行数据压缩。

不适合少量数据INSERT或UPDATE操作。

  1. 表的字段比较多(大宽表),查询中涉及到的列不多。
  2. 统计分析类查询 (关联、分组操作较多的场景)。
  3. 即席查询(查询条件不确定,行存表扫描难以使用索引)。

创建一个行存表

例如,创建一个名为customer_t1的行存表:

1
2
3
4
5
6
CREATE TABLE customer_t1
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
);

创建一个列存表

例如,创建一个名为customer_t2的列存表:

1
2
3
4
5
6
7
CREATE TABLE customer_t2
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
)
WITH (ORIENTATION = COLUMN);

使用压缩

表压缩可以在创建表时开启,压缩表能够使表中的数据以压缩格式存储,意味着占用相对少的内存。

对于I/O读写量大,CPU富足(计算相对小)的场景,选择高压缩比;反之选择低压缩比。建议依据此原则进行不同压缩下的测试和对比,以选择符合自身业务情况的最优压缩比。压缩比通过COMPRESSION参数指定,其支持的取值如下:

  • 列存表为:YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。
  • 行存表为:YES/NO,默认值为NO。(行存表压缩功能暂未商用,如需使用请联系技术支持工程师)

各压缩级别所适用的业务场景说明如下:

压缩级别

所适用的业务场景

低级别压缩

系统CPU使用率高,存储磁盘空间充足。

中度压缩

系统CPU使用率适中,但存储磁盘空间不是特别充足。

高级别压缩

系统CPU使用率低,磁盘空间不充裕。

例如,创建一个名为customer_t3的列存压缩表:

1
2
3
4
5
6
7
CREATE TABLE customer_t3
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
)
WITH (ORIENTATION = COLUMN,COMPRESSION=middle);