数据分区是数据库产品普遍具备的功能。在GaussDB 100分布式系统中,数据分区是在一个节点内部对数据按照用户指定的策略对数据做进一步的水平分表,将表按照指定范围划分为多个数据互不重叠的部分(Partition)。
GaussDB 100数据库支持的分区表为范围分区表、间隔分区表、列表分区表和哈希分区表。
- 范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是为常用的,并且分区键经常采用日期,例如将销售数据按照月份进行分区。
- 间隔分区表:间隔分区表是一种特殊的范围分区表。对于普通的范围分区,用户预先创建了多少个分区,如果插入不在该分区的数据时,数据库会报错,这种情况下,用户可以手动添加分区,也可以使用间隔分区。比如用户会按照每天一个分区的方式使用范围分区表,在业务部署时会创建一批分区(如3个月)以备后续使用,但是3个月后需要再次创建,不然后续的业务数据入库会报错。范围分区的这种方式增加了维护成本,需要内核支持分区的自动创建功能。如果使用间隔分区,用户可以不必关心后续分区的创建,既减少分区的设计成本和维护成本。
- 列表分区表:将庞大的表分割成小的、易于管理的小块。
- 哈希分区表:在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或列表分区。在这种情况下,哈希分区提供了一种在指定数量的分区中均等地划分数据的方法,写入表中的数据均匀地分布在各个分区中,用户无法预测数据将被写入哪个分区中。例如,如果销售城市不是相对固定的,而是遍布各地,很难对表进行列表分区,此时可以对该表进行哈希分区。
例如,表1描述了一个xDR(详单)场景下,基于时间分片的方式分区后带来的收益。
场景描述 | 收益 |
当表中访问率较高的行位于一个单独分区或少数几个分区时。 | 大幅减少搜索空间,从而提升访问性能。 |
当需要查询或更新一个分区的大部分记录时。 | 仅需要连续扫描对应分区,而非扫描整个表,因此可大幅提升性能。 |
当需要大量加载或者删除的记录位于一个单独分区或少数几个分区时。 | 可直接读取或删除对应分区,从而提升处理性能;同时由于避免大量零散的删除操作,可减少清理碎片工作量。 |
数据分区带来的好处在于:
- 改善可管理性:利用分区,可以将表和索引划分为一些更小、更易管理的单元。这样,数据库管理员在进行数据管理时就能采取“分而治之”的方法。 有了分区,维护操作可以专门针对表的特定部分执行。
- 可提升删除操作的性能:删除数据时可以删除整个分区,与分别删除每行相比,这种操作非常高效和快速。
删除分区表与删除普通表的语法一致,都是通过DROP TABLE语法进行删除。
- 改善查询性能:通过限制要检查或操作的数据数量,分区可带来许多性能优势。
- 分区剪枝:分区剪枝(也称为分区消除)是CN在执行时过滤掉不需要扫描的分区,只对相关的分区进行扫描的技术。分区剪枝通常可以将查询性能提高若干数量级。
- 智能化分区连接:通过使用一种称为智能化分区连接的技术,分区还可以改善多表连接的性能。当将两个表连接在一起,并且至少其中一个表使用连接键进行分区时,可以应用智能化分区连接。智能化分区连接将一个大型连接分为多个较小的连接,这些较小的连接包含与连接的表“相同”的数据集。这里,“相同”定义为恰好包含连接的两端中相同的分区键值集,因此可以确保只有这些“相同”数据集的连接才会有效,而不必考虑其他数据集。