
# 选择DWS表存储模型
DWS支持行列混合存储。当创建一个表时，可以选择表的存储格式为行存储或列存储。
行存储是指将表按行存储到硬盘分区上，列存储是指将表按列存储到硬盘分区上。默认情况下，创建的表为行存储。行存储和列存储的差异请参见[图1]。
图1行存储和列存储的差异
![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000001188323816.png "点击放大")
上图中，左上为行存表，右上为行存表在硬盘上的存储方式。左下为列存表，右下为列存表在硬盘上的存储方式。
DWS表的行/列存储通过表定义的orientation属性定义。当指定orientation属性为row时，表为行存储；当指定orientation属性为column时，表为列存储；如果不指定，默认为行存储。行、列存储模型各有优劣，建议根据实际情况选择：
表1表的存储类型及场景 
| **存储模型** | **优点**                                                                                                                                                                                                                                                                                                                                                                                                                                          | **缺点**                  | 适用场景                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|:---|:---|
| 行存       | 数据按照行进行存储，在查询某一行数据时，可以快速定位到目标位置。                                                                                                                                                                                                                                                                                                                                                                                                                | 查询时即使只涉及某几列，所有数据也都会被读取。 | 1. 表的字段个数比较少，查询表的大部分字段。  2. 点查询（返回记录少，基于索引的简单查询）。  3. 频繁进行增删改查操作且涉及整行数据。   |
| 列存       | 1. 查询时只有涉及到的列会被读取。  2. 列数据特征比较相似，能够更有效地进行数据压缩。   | 不适合少量数据INSERT或UPDATE操作。 | 1. 表的字段比较多（大宽表），查询中涉及到的列不多。  2. 统计分析类查询 (关联、分组操作较多的场景)。  3. 即席查询（查询条件不确定，行存表扫描难以使用索引）。   |
   
#### 创建一个行存表
例如，创建一个名为customer_t1的行存表：
```
CREATE TABLE customer_t1
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
);
```
#### 创建一个列存表
例如，创建一个名为customer_t2的列存表：
```
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的列存压缩表：
```
CREATE TABLE customer_t3
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
)
WITH (ORIENTATION = COLUMN,COMPRESSION=middle);
```
