
# DWS时序表转HStore表最佳实践
由于新的列存HStore表在入库性能、压缩比和查询性能方面都优于时序表（TimeSeries表），所以推荐使用HStore表替代TimeSeries表，本章节介绍如何将存量的时序表转换为HStore表。
**HStore表使用实践** 参见[实时数仓及HStore表使用最佳实践](https://support.huaweicloud.com/bestpractice-dws/dws_05_0029.html)。
TimeSeries表一般包含三种列：TSTime列，TSTag列和TSField列。
- TSTime时序列，有且仅有一个，且按它进行自动分区。
- TSTag表示维度列。
- TSField表示事实列，维度与事实信息混存。
例如：创建时序表CPU。
```
CREATE TABLE CPU(
scope_name text TSTag,
server_ip text TSTag,
group_path text TSTag,
time timestamptz TSTime,
idle numeric TSField,
users numeric TSField) 
with (TTL='30 days', PERIOD = '1 hour', orientation=TIMESERIES);
```
将时序表改造为HStore表，除了直接创建HStore表，还需要做二级分区，bitmap索引的设置，才能发挥HStore表的最佳能力。
- 推荐将TSTime列作为分区键。
- 推荐将第一个TSTag列作为二级分区列。
- 推荐将所有TSTag列作为bitmap索引列。
改造后的建表语句如下：
```
CREATE TABLE CPU(
scope_name text,
server_ip text,
group_path text,
time timestamptz,
idle numeric,
users numeric) 
WITH(TTL='30 days', PERIOD = '1 hour', 
ORIENTATION=column, ENABLE_HSTORE_OPT=true, --使用列存hstore_opt类型
SECONDARY_PART_COLUMN='scope_name', --将第一个TSTag列作为二级分区列
BITMAP_COLUMNS='scope_name,server_ip,group_path' --将所有TSTag列作为bitmap索引列
)
PARTITION BY RANGE(time) --time为TIMESERIES中的TSTime列
(
    PARTITION p1 VALUES LESS THAN('2023-02-13 12:00:00'),
    PARTITION p2 VALUES LESS THAN('2023-02-13 13:00:00')
...
);
--根据查询性能，在其它TSTag列上，自行选择创建一个或多个B-Tree索引
```
