摘要: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_factorfrom (select schemaname,tablename,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[4]::bigint as vprocname,(regexp_split_to_array(tbl_dis,'[\,\(\)]+'))[5]::bigint as dnsizefrom (select nspname as schemaname,relname as tablename,table_distribution(nspname,relname)::text as tbl_disfrom pg_class ainner join pg_namespace bon a.relnamespace = b.oidand 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级数仓黑科技,后盾还可获取泛滥学习材料~

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