快速定位查询存储倾斜的表 本章节主要介绍 快速定位查询存储倾斜表的最佳实践。 目前提供的倾斜查询接口有函数:tabledistribution(schemaname text, tablename text) 、tabledistribution() 以及视图PGXCGETTABLESKEWNESS,客户可以根据自身业务情况来选择使用。 场景一:磁盘满后快速定位存储倾斜的表 首先,通过pgstatgetlastdatachangedtime(oid)函数查询出近期发生过数据变更的表,介于表的最后修改时间只在进行IUD操作的CN记录,要查询库内1天(间隔可在函数中调整)内被修改的所有表,可以使用如下封装函数: CREATE OR REPLACE FUNCTION getlastchangedtable(OUT schemaname text, OUT relname text) RETURNS setof record AS $$ DECLARE rowdata record; rowname record; querystr text; querystrnodes text; BEGIN querystrnodes : 'SELECT nodename FROM pgxcnode where nodetype ''C'''; FOR rowname IN EXECUTE(querystrnodes) LOOP querystr : 'EXECUTE DIRECT ON (' rowname.nodename ') ''SELECT b.nspname,a.relname FROM pgclass a INNER JOIN pgnamespace b on a.relnamespace b.oid where pgstatgetlastdatachangedtime(a.oid) BETWEEN currenttimestamp 1 AND currenttimestamp;'''; FOR rowdata IN EXECUTE(querystr) LOOP schemaname rowdata.nspname; relname rowdata.relname; return next; END LOOP; END LOOP; return; END; $$ LANGUAGE plpgsql; 然后,通过tabledistribution(schemaname text, tablename text)查询出表在各个DN占用的存储空间。 SELECT tabledistribution(schemaname,relname) FROM getlastchangedtable(); 场景二:常规数据倾斜巡检 在库中表个数少于1W的场景,直接使用倾斜视图查询当前库内所有表的数据倾斜情况。 SELECT FROM pgxcgettableskewness ORDER BY totalsize DESC; 在库中表个数非常多(至少大于1W)的场景,因PGXCGETTABLESKEWNESS涉及全库查并计算非常全面的倾斜字段,所以可能会花费比较长的时间(小时级),建议参考PGXCGETTABLESKEWNESS视图定义,直接使用tabledistribution()函数自定义输出,减少输出列进行计算优化,例如: SELECT schemaname,tablename,max(dnsize) AS maxsize, min(dnsize) AS minsize FROM pgcatalog.pgclass c INNER JOIN pgcatalog.pgnamespace n ON n.oid c.relnamespace INNER JOIN pgcatalog.tabledistribution() s ON s.schemaname n.nspname AND s.tablename c.relname INNER JOIN pgcatalog.pgxcclass x ON c.oid x.pcrelid AND x.pclocatortype 'H' GROUP BY schemaname,tablename;