关于GaussDB:GaussDBDWS发生数据倾斜不要慌一文教你轻松获取表倾斜率

57次阅读

共计 2414 个字符,预计需要花费 7 分钟才能阅读完成。

摘要:GaussDB(DWS) 是 MPP 并行架构,若表的数据存在歪斜状况,会引起一系列性能问题,影响用户体验,重大时可能会引起系统故障。因而能疾速获取歪斜的表并整改是 GaussDB(DWS) 运维管理人员比拟关注的事件。

本文分享自华为云社区《GaussDB(DWS) 产生数据歪斜不要慌,一文教你轻松获取表歪斜率》,原文作者:SeqList。

GaussDB(DWS) 是 MPP 并行架构,若表的数据存在歪斜状况,会引起一系列性能问题,影响用户体验,重大时可能会引起系统故障。因而能疾速获取歪斜的表并整改是 GaussDB(DWS) 运维管理人员比拟关注的事件。

需要形容

GaussDB(DWS) 本身提供 pgxc_get_table_skewness 视图来查问歪斜状况,但理论实际过程中,该视图存在性能问题,且该视图的歪斜率计算有问题。实际过程中,该视图获取的某个表的歪斜率在不高的状况下(例如 0.03),但实际上该表是存在歪斜状况的。

同时在很多时候咱们须要获取一个 schema 下所有表的歪斜率,以排查歪斜问题,pgxc_get_table_skewness 在产品文档中也形容是一个性能较差的视图。

因而我的项目实际过程中急需一个性能好且能表白歪斜状况的函数或视图。

设计思路

GaussDB(DWS) 有获取每个 DN 的空间大小函数 table_distribution,通过该函数,咱们能疾速获取每个 DN 的大小,同时能够依据每个 DN 的大小,来获取表的歪斜状况:

skewness = (max(dnsize) – avg(dnsize))*100/max(dnsize)

该歪斜率公式计算表的最大 DN 空间大小与均匀 DN 空间大小的占比,能精确反映歪斜率,乘 100 为体现百分比。

实现过程

依据歪斜公式,咱们得出以下 SQL,该 SQL 能疾速获取 schema 所有表的歪斜状况,上面以 public 为例:

select schemaname,tablename,sum(dnsize)/1024^3 dnsize_gb,(max(dnsize) - avg(dnsize))*100/nullif(max(dnsize),0) skewness_factor
from (
select schemaname
,tablename
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname
,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as dnsize
from (
select nspname as schemaname
,relname as tablename
,table_distribution(nspname,relname)::text as tbl_dis
from pg_class a
inner join pg_namespace b
on a.relnamespace = b.oid
and a.relkind = 'r'
and b.oid not in (100)
)
) 
where schemaname= 'public' group by 1,2 order by 3 desc;

后果样例如下,通过例子,能够看进去,test13 这个表 2GB,且产生重大的歪斜 97%,同时 store_sales1 一个 70GB 的大表也存在歪斜状况 58%

与 GaussDB(DWS) 的 pgxc_get_table_skewness 视图后果比对

应用 GaussDB(DWS) 的零碎视图 pgxc_get_table_skewness,比拟难看进去 store_sales1 存在歪斜状况。

此处咱们应用的是零碎视图 pgxc_get_table_skewness 获取

select * from  PGXC_GET_TABLE_SKEWNESS where schemaname = 'public' and tablename in ('store_sales1','test13');

从后果上看,skewratio 字段,test13 表能看进去存在重大歪斜状况,而 store_sales1 的 skewratio 值只有 0.031,看不出来存在歪斜状况。但事实上该表是存在肯定歪斜的

咱们通过 table_skewness 看每个 DN 的数据分布验证,发现 store_sales1 确实存在肯定歪斜。

总结:

GaussDB(DWS) 的歪斜率获取视图 pgxc_get_table_skewness 的后果,虽能反映重大歪斜的表,但存在歪斜的大表则比拟难看进去。同时该函数存在肯定的性能问题,较多表的状况下根本执行不进去。

本文提供的歪斜率获取方法能比拟精确反映表的歪斜状况且能叫疾速获取整 schema 所有的表的歪斜率办法;该办法在测试过程中,数据量越大,表越多,执行的工夫会越慢,测试一个 schema 约 3800 张表,共 40TB 左右的数据,在 5 分钟左右获取所有表的空间大小与歪斜率。

但本文提供的办法只能对单个 schema 操作,对整个数据库获取表空间大小与歪斜率,实测无奈执行胜利。若对时效性不要求的话,能够每天固定一个工夫,已跑批的模式,获取一个库的所有表清单,应用 table_distribution 函数,一次一个表地获取表的空间信息,应用多并发执行,这样的形式能在肯定工夫内将所有表的空间状况执行实现。

例如:对整库有 10 万张表的状况,能够应用 100 个并发同时执行 insert into table_size_info select * from table_distribution(‘schema.table’); 这样的形式将 10 万张表的 DN 空间信息获取实现,而后应用本文的公式汇总获取每个表的歪斜率与空间总大小。

想理解 GuassDB(DWS) 更多信息,欢送微信搜寻“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后盾还可获取泛滥学习材料~

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0