ITPub博客

首页 > 数据库 > > 导入数据-查看数据倾斜状态

导入数据-查看数据倾斜状态

作者:GaussDB_数据库 时间:2020-01-14 14:11:05 0 删除 编辑

操作场景

数据倾斜会造成查询表性能下降。对于记录数超过千万条的表,建议在执行全量数据导入前,先导入部分数据,以进行数据倾斜检查和调整分布列,避免导入大量数据后发现数据倾斜,调整成本高。

背景信息

GaussDB 200是采用Shared-nothing架构的MPP(Massive Parallel Processor,大规模并发处理)系统,采用水平分布的方式,将业务数据表的元组按合适的分布策略分散存储在所有的DN。

当前产品支持复制(Replication)和散列(Hash)两种用户表分布策略。

  • Replication方式:在每一个DN上存储一份全量表数据。对于数据量比较小的表建议采取Replication分布策略。
  • Hash方式:采用这种分布方式,需要为用户表指定一个分布列(distribute key)。当插入一条记录时,系统会根据分布列的值进行hash运算后,将数据存储在对应的DN中。对于数据量比较大的表建议采取Hash分布策略。

对于Hash分布策略,如果分布列选择不当,可能导致数据倾斜。因此在采用Hash分布策略之后会对用户表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。一般情况下分布列都是选择键值重复度小,数据分布比较均匀的列。

操作步骤

  1. 分析数据源特征,选择若干个键值重复度小,数据分布比较均匀的备选分布列。
  2. 从步骤1中选择一个备选分布列创建目标表。
    CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name 
    ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
    | table_constraint | LIKE source_table [ like_option [...] ] }
    [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ COMPRESS | NOCOMPRESS ] [ TABLESPACE tablespace_name ]
    [ DISTRIBUTE BY { REPLICATION
    | { HASH ( column_name [,...] ) } } ];

  3. 参照前面章节中的办法向目标表中导入小批量数据。

    对于单个数据源文件,在导入时,可通过均匀切割,导入部分切割后的数据源文件来验证数据倾斜性。

  4. 检验数据倾斜性。命令中的table_name ,请填入实际的目标表名。
    SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;

  5. 若各DN上数据分布差小于10%,表明数据分布均衡,选择的分布列合适。请清理已导入小批量数据,导入全量数据,以完成数据迁移。

    若各DN上数据分布差大于等于10%,表明数据分布倾斜,请从步骤1的备选分布列中删除该列,删除目标表,并重复步骤2 、步骤3 、步骤4 和步骤5。

  6. (可选)如果上述步骤不能选出适合的分布列,需要从备选分布列选择多个列的组合作为分布列来完成数据迁移。

示例

对目标表staffs选择合适的分布列。

  1. 分析表staffs的数据源特征,选择数据重复度低且分布均匀的备选分布列staff_ID、FIRST_NAME和LAST_NAME。
  2. 先选择staff_ID作为分布列,创建目标表staffs。
    CREATE TABLE staffs
    (
    staff_ID NUMBER(6) not null,
    FIRST_NAME VARCHAR2(20),
    LAST_NAME VARCHAR2(25),
    EMAIL VARCHAR2(25),
    PHONE_NUMBER VARCHAR2(20),
    HIRE_DATE DATE,
    employment_ID VARCHAR2(10),
    SALARY NUMBER(8,2),
    COMMISSION_PCT NUMBER(2,2),
    MANAGER_ID NUMBER(6),
    section_ID NUMBER(4)
    )
    DISTRIBUTE BY hash(staff_ID);
  3. 向目标表staffs中导入部分数据。
    根据以下查询所得,集群环境中主DN数为8个,则建议导入的记录数为80000条。
    SELECT count(*) FROM pgxc_node where node_type='D';
    count
    -------
    8
    (1 row)
  4. 校验以staff_ID为分布列的目标表staffs的数据倾斜性。
    SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
    count | node_name
    ------+-----------
    11010 | datanode4
    10000 | datanode3
    12001 | datanode2
    8995 | datanode1
    10000 | datanode5
    7999 | datanode6
    9995 | datanode7
    10000 | datanode8
    (8 rows)
  5. 根据上一步骤查询所得,各DN上数据分布差大于10%,数据分布倾斜。所以从步骤1的备选分布列中删除该列,并删除目标表staffs。
    DROP TABLE staffs;
    尝试选择staff_ID、FIRST_NAME和LAST_NAME的组合作为分布列,创建目标表staffs。
  6. CREATE TABLE staffs
    (
    staff_ID NUMBER(6) not null,
    FIRST_NAME VARCHAR2(20),
    LAST_NAME VARCHAR2(25),
    EMAIL VARCHAR2(25),
    PHONE_NUMBER VARCHAR2(20),
    HIRE_DATE DATE,
    employment_ID VARCHAR2(10),
    SALARY NUMBER(8,2),
    COMMISSION_PCT NUMBER(2,2),
    MANAGER_ID NUMBER(6),
    section_ID NUMBER(4)
    )
    DISTRIBUTE BY hash(staff_ID,FIRST_NAME,LAST_NAME);
  7. 校验以staff_ID、FIRST_NAME和LAST_NAME的组合为分布列的目标表staffs的数据倾斜性。
    SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
    count | node_name
    ------+-----------
    10010 | datanode4
    10000 | datanode3
    10001 | datanode2
    9995 | datanode1
    10000 | datanode5
    9999 | datanode6
    9995 | datanode7
    10000 | datanode8
    (8 rows)
  8. 根据上一步骤查询所得,各DN上数据分布差小于10%,数据分布均衡,选择的分布列合适。
  9. 清理已导入小批量数据。
    TRUNCATE TABLE staffs;
    导入全量数据,以完成数据迁移。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69959250/viewspace-3152682/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 其他语句-锁操作
请登录后发表评论 登录
全部评论

注册时间:2020-01-06

  • 博文量
    2907
  • 访问量
    19275