---
title: 数据库Segment优化
description: "选择合适的分布键，分布键是表里的唯一性索引，可以是一个或者多个列。（理想情况下，单列可以将数据平均分布在每个Segment上）。合适的分布键，每个Segment上应该有相同的记录数。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/Greenplum/kunpengdbstune_05_0034.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/Greenplum/kunpengdbstune_05_0034.html
indexId: c7da0cea536b5170d7abeff008e5d043fa7af497175bd79bb840d5fb8b7f435f75
---
# 数据库Segment优化

#### 表分布

选择合适的分布键，分布键是表里的唯一性索引，可以是一个或者多个列。（理想情况下，单列可以将数据平均分布在每个Segment上）。合适的分布键，每个Segment上应该有相同的记录数。

选择分布键原则：

- 尽量选择经常需要JOIN的列，减少重分布或者广播小表带来的开销。
- 尽量选择分布均匀的列或者多列，减少时间消耗卡在单个Segment的风险。
- 分布键和分区键不要放在同一列上。
- 只有在没有合适分布键的情况下，选择随机分布，且尽量选择类似维度表的小表。类似事实表的大表，不要选择随机分布。


#### 表分区

合适的分区策略减少访问数据量，只访问相关数据。但分区不是分布式的替代品，数据分布是在物理上拆分表数据，将数据打散到各个节点，使数据可以并行计算，这在Greenplum中是必须的。而表分区是在逻辑上拆分大表的数据提高查询性能，也有利于数据生命周期的管理，而分区和分布式一起使用，可提升查询性能。

选择分区原则：

- 表数据量是否足够大：通常对于大的事实表，比如数据量有几千万或者过亿，我们可以考虑使用分区表，但数据量大小并没有一个绝对的标准可以使用，一般是根据经验，以及对目前性能是否满意。
- 表是否有合适的分区字段：如果数据量足够大了，这个时候我们就需要看下是否有合适的字段能够用来分区，通常如果数据有时间维度，比如按天，按月等，是比较理想的分区字段。
- 表内数据是否具有生命周期：通常数仓中的数据不可能一直存放，一般都会有一定的生命周期，比如最近一年等，这里就涉及到对旧数据的管理，如果有分区表，就很容易删除旧的数据，或者将旧的数据归档到对象存储等更为廉价的存储介质上。
- 查询语句中是否含有分区字段：如果你对一个表做了分区，但是所有的查询都不带分区字段，这不仅无法提高性能反而会使性能下降，因为所有的查询都会扫描所有的分区表。


#### 表压缩和列存储

Greenplum支持行存储和列存储，行存储适合非常典型的OLTP应用场景，而列存储适合OLAP应用场景，尤其是按列做较大范围的聚合分析等。在列存储上进行压缩，可以减少IO访问。
