VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

审视和修改表定义

审视和修改表定义概述

好的表定义至少需要达到以下几个目标:

  • 减少扫描数据数据量。通过分区的剪枝机制可以实现该点。

  • 尽量极少随机IO。通过聚簇/局部聚簇可以实现该点。

表定义在数据库设计阶段创建,在SQL调优过程中进行审视和修改。

选择存储模型

进行数据库设计时,表设计上的一些关键项将严重影响后续整库的查询性能。表设计对数据存储也有影响:好的表设计能够减少I/O操作及最小化内存使用,进而提升查询性能。

表的存储模型选择是表定义的第一步。客户业务属性是表的存储模型的决定性因素,依据下面表格选择适合当前业务的存储模型。

存储模型 适用场景
行存 点查询(返回记录少,基于索引的简单查询)。
增删改比较多的场景。
列存 统计分析类查询 (group , join多的场景)。

使用分区表

分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点:

  • 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。

  • 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。

  • 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。

Vastbase支持的分区表为范围分区表。

范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。

选择数据类型

高效数据类型,主要包括以下三方面:

  • 尽量使用执行效率比较高的数据类型

    一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。

  • 尽量使用短字段的数据类型

    长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。

  • 使用一致的数据类型

    表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。