GaussDB表设计最佳实践
目录
如何选择存储模型
如何选择数据分布方式
如何选择分布列
其他最佳设计建议
使用局部聚簇
使用分区表
选择数据类型
如何选择存储模型
进行数据库设计时,表设计上的一些关键项将严重影响后续整库的查询性能。表设计对数据存储也有影响:好的表设计能够减少I/O操作及最小化内存使用,进而提升查询性能。
表的存储模型选择是表定义的第一步。客户业务属性是表的存储模型的决定性因素,依据下面表格选择适合当前业务的存储模型。
存储模型 | 适用场景 |
---|---|
行存 | 点查询(返回记录少,基于索引的简单查询)。 增删改比较多的场景。 |
列存 | 统计分析类查询 (group , join多的场景)。 |
如何选择数据分布方式
复制表(Replication)方式将表中的全量数据在集群的每一个DN实例上保留一份。主要适用于记录集较小的表。这种存储方式的优点是每个DN上都有该表的全量数据,在join操作中可以避免数据重分布操作,从而减小网络开销,同时减少了plan segment(每个plan segment都会起对应的线程);缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表。
哈希(Hash)表将表中某一个或几个字段进行hash运算后,生成对应的hash值,根据DN实例与哈希值的映射关系获得该元组的目标存储位置。对于Hash分布表,在读/写数据时可以利用各个节点的IO资源,大大提升表的读/写速度。一般情况下大表定义为Hash表。
范围(Range)和列表(List)分布是由用户自定义的分布策略,根据分布列的取值落入满足一定范围或者具体值的对应目标DN,这两种分布方式便于用户灵活地进行数据管理,但对用户本身的数据抽象能力有一定的要求。
策略 | 描述 | 适用场景 |
---|---|---|
Hash | 表数据通过hash方式散列到集群中的所有DN实例上。 | 数据量较大的事实表。 |
Replication | 集群中每一个DN实例上都有一份全量表数据。 | 小表、维度表。 |
Range | 表数据对指定列按照范围进行映射,分布到对应DN。 | 用户需要自定义分布规则的场景。 |
List | 表数据对指定列按照具体值进行映射,分布到对应DN。 | 用户需要自定义分布规则的场景。 |
如图1所示,复制表如图中的表T1,哈希表如图中的表T2。
图1 复制表和哈希表
如何选择分布列
Hash分布表的分布列选取至关重要,需要满足以下原则:
- 列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。
- 在满足上述条件的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。
对于Hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。可以使用以下SQL检查数据倾斜性
|
其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。
GaussDB支持多分布列特性,可以更好地满足数据分布的均匀性要求。
Range/List分布表的分布列由用户根据实际需要进行选择。除了需选择合适的分布列,还需要注意分布规则对数据分布的影响。
其他最佳设计建议
使用局部聚簇
局部聚簇(Partial Cluster Key)是列存下的一种技术。这种技术可以通过min/max稀疏索引较快的实现基表扫描的filter过滤。Partial Cluster Key可以指定多列,但是一般不建议超过2列。Partial Cluster Key的选取原则:
- 受基表中的简单表达式约束。这种约束一般形如col op const,其中col为列名,op为操作符 =、>、>=、<=、<,const为常量值。
- 尽量采用选择度比较高(过滤掉更多数据)的简单表达式中的列。
- 尽量把选择度比较高的约束col放在Partial Cluster Key中的前面。
- 尽量把枚举类型的列放在Partial Cluster Key中的前面。
使用分区表
分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点:
- 改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。
- 增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。
- 方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。
GaussDB支持的分区表为范围分区表。
范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。
选择数据类型
高效数据类型,主要包括以下三方面:
- 尽量使用执行效率比较高的数据类型
一般来说整型数据运算(包括=、>、<、≧、≦、≠等常规的比较运算,以及group by)的效率比字符串、浮点数要高。比如某客户场景中对列存表进行点查询,filter条件在一个numeric列上,执行时间为10+s;修改numeric为int类型之后,执行时间缩短为1.8s左右。
- 尽量使用短字段的数据类型
长度较短的数据类型不仅可以减小数据文件的大小,提升IO性能;同时也可以减小相关计算时的内存消耗,提升计算性能。比如对于整型数据,如果可以用smallint就尽量不用int,如果可以用int就尽量不用bigint。
- 使用一致的数据类型
表关联列尽量使用相同的数据类型。如果表关联列数据类型不同,数据库必须动态地转化为相同的数据类型进行比较,这种转换会带来一定的性能开销。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践
作者:京东零售 姜海 灵动岛是苹果在iPhone 14 Pro和iPhone 14 Pro Max上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时,灵动岛会变化形态,以便让用户能够更直观地接收到这些信息。 而在用户使用一些应用App,比如音乐,并将其切换到后台时,灵动岛也能以另一种形态来显示这些软件,还可以通过轻点,重按等来实现的操作,比如切换歌曲。 苹果在iOS16.1系统对第三方开放了灵动岛的API,并允许开发者基于灵动岛开发相应软件,越来越多的APP开始基于灵动岛的交互进行设计和开发,本文将简单介绍灵动岛开发的流程和将其与业务场景相结合的思考。 接入灵动岛 如果项目之前开发过widget小组件,已经添加过Widget Extension,并有WidgetBundle文件,那么可以直接基于其进行扩展开发。但要注意的是,灵动岛开发用到的是Live Activity,主要包括锁屏通知,顶部通知等样式: 而并不是widget开发用到的Time Line形式,两者在UI形态上基本毫无关系,只是需要在WidgetBundle中实例化。如果之前没...
- 下一篇
禅道 OpenAI 插件 1.1 版本来啦,新增 GPT 的任务和 Bug 润色功能!
昨日我们发布了包含ChatGPT 聊天框(神奇海螺)和需求润色功能的禅道OpenAI插件1.0版本,广受大家欢迎。今天,最新版本1.1发布,新增任务和Bug的润色功能,还修复了权限及图片展示的问题,大家可以更方便、更顺畅地使用OpenAI插件啦! 任务润色 在执行-任务功能下,GPT可帮助团队成员进行任务的润色、完善和优化。 它可以: 将任务标题、任务描述转换得更为清晰、具体; 将原有语句转换得更符合语法规则; 转换后不合适的需求可以进行重新转换,直到满意为止; 可以根据转换后的内容再度调整原有任务描述,重新转换。 Bug润色 在测试-Bug功能下,在执行-任务功能下,GPT可帮助测试人员进行Bug的合理优化。 它可以: 将Bug标题描述转换得更为清晰、具体,并符合语法规则; 将Bug的复现步骤和期望分解为步骤、结构、期望三个更为清晰的结构; 转换后不合适的Bug可以进行重新转换,直到满意为止; 可以根据转换后的内容再度调整原有Bug描述、复现步骤和期望,重新转换。 插件安装和配置 下载地址:https://www.zentao.net/extension-viewExt-218.ht...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Red5直播服务器,属于Java语言的直播服务器
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS关闭SELinux安全模块