点击上方"蓝字"

关注我们吧!

GaussDB如果采用分布式部署模式,则可以根据数据量以及用途定义两种不同分布方式的表,分别为复制表(Replication)和哈希(Hash)表。

复制表(Replication)是将表中的全量数据在集群的每一个DN实例上保留一份,主要适用于数据量较小的表。这种存储方式的优点是每个DN上都有此表的全量数据,在Join操作中可以避免数据重分布操作,从而减小网络开销。缺点是每个DN都保留了表的完整数据,造成数据的冗余。一般情况下只有较小的维度表才会定义为Replication表。

哈希(Hash)表是将表中某一个或几个字段进行hash运算后,生成对应的hash值,根据DN实例与哈希值的映射关系获得该元组的目标存储位置。对于Hash分布表,在读/写数据时可以利用各个节点的IO资源,大大提升表读/写速度。一般情况下大表定义为Hash表。

Hash分布表的分布列选取至关重要,需要满足以下原则:

(1)列值应比较离散,以便数据能够均匀分布到各个DN。例如,考虑选择表的主键为分布列,如在人员信息表中选择身份证号码为分布列。

(2)在满足第一条原则的情况下尽量不要选取存在常量filter的列。例如,表dwcjk相关的部分查询中出现dwcjk的列zqdh存在常量的约束(例如zqdh=’000001’),那么就应当尽量不用zqdh做分布列。

(3)在满足前两条原则的情况下,考虑选择查询中的连接条件为分布列,以便Join任务能够下推到DN中执行,且减少DN之间的通信数据量。

(4)一般不建议新增一列专门用作分布列,尤其不建议新增一列且用SEQUENCE的值来填充做为分布列,因为SEQUENCE可能会带来性能瓶颈和不必要的维护成本。

对于Hash分布表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分布表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。

GaussDB中提供了1个视图pgxc_get_table_skewness,可以查询数据库中所有schema下的表在各个DN的分布情况以及倾斜率,虽然可以通过schemaname和tablename查询指定表的倾斜情况,但该视图查询时耗时较长,仅适用于数据量较小的表(10W以下),尤其不建议不增加条件查询所有表的数据倾斜情况。该视图各个字段说明如下:

除此之外,可以使用函数table_skewness()和table_distribution()查询指定表的数据倾斜情况。在使用table_skewness()时,如果不指定具体字段,默认查询当前分布列的数据倾斜程度,则该函数可以用来评估表的其他字段分布倾斜情况。同样,当表的数据量巨大时,这两个函数查询耗时都比较长。因此对于一张数据量较大的表,一般使用如下语句查询其数据倾斜情况:

select xc_node_id, count(1) from tablename group by xc_node_id order by xc_node_id desc;

如果需要查询数据库中倾斜的表,除了使用上面提到的视图pgxc_get_table_skewness,还可以通过排查各个DN实例数据存储目录的大小以及数据文件来找出倾斜的表,这也是实际应用中比较常用的方法。

具体方法及步骤如下:

(1)在所有节点上执行df –h查看各个DN数据目录使用率是否有接近,找到使用率明显较大的磁盘目录。

(2)通过 cm_ctl query –Cvd 确认该磁盘节点对应的DN实例(如上一步检查为slave磁盘占用率过大,则需要查看与该备实例对应的主实例磁盘使用情况),确认DN实例端口号。可通过以下方式查询DN实例端口号:

select * from pgxc_node;
或者
cat DN实例数据目录/postgresql.conf |grep Port

(3)进入实例base目录,执行du -ak | sort -nr | more查找文件大小为1GB,且文件前缀数字ID相同的文件,查找相同文件数量最多的文件,记录其ID值及其所在文件目录ID值。

(4)通过gsql连接DN实例,并通过文件目录ID确认表所属数据库。

select oid,* from pg_database where oid='1642599';

(5)切换至该数据库,通过文件的ID确认表名称,执行如下SQL:

select relname from pg_class where relfilenode = 3308672;

(6)根据表名称进一步确认该表所属schema,执行如下SQL:

SELECT n.nspname as "Schema",
c.relname as "Name"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n
ON n.oid = c.relnamespace
WHERE relname = 'insured';

(7)通过gsql连接CN实例,最后再通过table_skewness()函数进行核实确认。

墨天轮原文链接:https://www.modb.pro/db/73760(复制链接至浏览器或点击文末阅读原文查看)

END

推荐阅读:267页!2020年度数据库技术年刊

推荐下载:2020数据技术嘉年华PPT下载

2020数据技术嘉年华近50个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2020DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

GaussDB Hash表分布列选择原则及数据倾斜检测相关推荐

  1. 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践

    确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...

  2. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?

    B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...

  3. sqlyog表添加列_如何用数据透视表求差,而不是求和?

    如图 8‑43中上图所示为某商店2012年第一季度的商品销售明细表,如何利用数据透视表快速统计各商品销量与上个月的差异如图 8‑43中下图所示? 图8‑43销售报表 1.解决方案 创建数据透视表,设置 ...

  4. Greenplum 调优--数据分布法则 - 分布列与分区的选择

    分布列选择黄金法则 由于Greenplum是一个分布式的数据库,数据是分散存储在各个数据节点的,所以需要告诉Greenplum数据应该如何分布. 短板效应 当用户请求QUERY时,Greenplum会 ...

  5. 在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)...

    准备工作 这里假设,你已经在 k8s 上部署好了基于 Citus 扩展的分布式 PostgreSQL 集群. 查看 Citus 集群(kubectl get po -n citus),1 个 Coor ...

  6. libevent中的hash表

    libevent中的hash表的代码在ht-internal文件中,在添加io事件,signal事件时,底层是在操作  event_io_map和event_signal_map 1. hash的 ...

  7. 原创:PHP内核研究:HASH表和变量

    PHP HASH表 在PHP中,所有的数据 无论变量,常量,类,属性 都用Hash表来实现. 先要说说 HASH表 [c]typedef struct bucket { ulong h; /* Use ...

  8. 【Gbase】建表时候hash分布列的制定方式(DISTRIBUTED BY column_name)

    建立hash分布列的好处: 加快数据的查找速度. hash分布列的使用注意事项: 通常是等值查询的列,并且使用的频率很高,且不被更改的列,通常为int类型或者字符串类型.group by后面尽量也使用 ...

  9. 哈希hash(散列)表结构详解

    哈希表结构讲解: 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这 ...

  10. mysql库表散列_数据库表--hash clustered table

    Hash clustered table与索引聚簇表非常相似,只有一个主要区别:聚簇键索引被一个hash函数所取代,表中的数据就是索引.所以没有物理索引 hash clustered table也有副 ...

最新文章

  1. OVS datapath简介(十八)
  2. [应用][js+css3]3D盒子导航[PC端]
  3. 2018,腾讯110,感谢有你
  4. 人形图案c语言程序_最多 280 字符,你能用 Basic 玩出哪些花样程序来?
  5. 一次性说清楚秒验(本机号码一键登录)基本原理、优势、场景、交互过程和常见的问题
  6. Vuejs 条件判断
  7. 让数据库无惧灾难,华为云GaussDB同城双集群高可用方案正式发布!
  8. win8学习--------计时器
  9. py2neo match
  10. 多播报文的发送和接收
  11. 频谱仪的更改ip_通过局域网(LAN)读取频谱分析仪图像的方法
  12. 首都师范 博弈论 5 4 4 多人合作博弈问题 Shapley计算之财产分配问题
  13. 解决 Invalid MEX-file ‘xxx.mexw64‘: 找不到指定的模块 的问题
  14. python求和1到100_python实现1加到100
  15. Total Control的深入用法,如何使用脚本实现启动或重启指定App
  16. php做一个文章页面,wordpress主题制作教程(十):制作文章单页模板single.php
  17. Docker常用的命令
  18. 浅谈微机综合自动化系统在化工企业变电站中应用
  19. JSVM实现可伸缩视频编码(SVC)
  20. 计算机重装系统的方法,电脑怎么刷机重装系统 电脑刷机重装系统的方法

热门文章

  1. Windows映射网络驱动器
  2. 对象转json忽略空参
  3. 微信小程序开源demo汇总
  4. Android代码中模拟点击事件
  5. Cocos Creator 实现大厅+子游戏模式
  6. Android 动态壁纸
  7. Java将json格式数据转换为对象
  8. SM3密码杂凑算法原理
  9. Centos7下安装svnadmin
  10. kettle下载和使用