在日常的维护工作中,我们需要定期检查实例是否出现数据倾斜,防止个别计算组由于数据过多导致实例被锁定。

您可以通过以下方法,快速定位出表倾斜的信息。如下步骤以一个具体的样例展开描述:

  • 针对单个表或库,可以通过查看空间占用的方式来确定是否有倾斜。
    • 判断某个库是否出现数据的倾斜:
      select pg_size_pretty(pg_database_size('dbname')) from gp_dist_random('gp_id');

      通过上述语句,可以看出名为dbname的库在每个节点上占用的空间,当某个或个别几个节点的空间明显大于其他节点时,说明该库上有数据倾斜存在。

    • 判断某张表是否出现数据的倾斜:
      select pg_size_pretty(pg_relation_size('tblname')) from gp_dist_random('gp_id');

      通过上述语句,可以看出名为tblname的表在各个节点上占用的空间,当某个或个别几个表的空间明显大于其他表时,说明该表上有数据倾斜存在,需要修改该表的分布键以调整数据分布。

  • 利用系统视图判断数据倾斜。
    • 利用下面语句判断是否在存储上有倾斜,原理与查看空间占用类似:
      select * from gp_toolkit.gp_skew_coefficients;

      该视图会基于表的行的数据量来检查,如果表数据量越大,检查时间就会越长。

    • 通过视图gp_toolkit.gp_skew_idle_fractions 计算在表扫描过程中系统闲置资源的百分比,来判断数据倾斜的情况:
      select * from gp_toolkit.gp_skew_idle_fractions;

更多详情,请参考 Distribution and Skew