在Hologres中合理的Table Group选择与Shard Count制定能够从根本上提升数据的存储与计算效率。本文将为您介绍在Hologres中设置Table Group与Shard Count。

获取Table Group元数据

  1. 查看默认Table Group
    SELECT * FROM hologres.hg_table_group_properties
    WHERE tablegroup_name IN (
      SELECT tablegroup_name FROM hologres.hg_table_group_properties
      WHERE property_key = 'is_default_tg' AND property_value = '1'
    );
    结果:
    说明 结果中is_default_tg代表为默认Table Group,shard_count代表Table Group对应的Shard数。
    tablegroup_name |   property_key   | property_value
    -----------------+------------------+----------------
     test_tg_default | tg_version       | 1
     test_tg_default | table_num        | 1               
     test_tg_default | is_default_tg    | 1               
     test_tg_default | shard_count      | 3
     test_tg_default | replica_count    | 1
     test_tg_default | created_manually | 0
    (6 rows)
  2. 查看当前数据库有哪些Table Group
    SELECT tablegroup_name
    FROM hologres.hg_table_group_properties GROUP BY tablegroup_name;
    结果:
    tablegroup_name
    -----------------
     test_tg_default
    (1 row)
  3. 查看某Table Group设置的Shard数
    SELECT property_value AS shard_count
    FROM hologres.hg_table_group_properties
    WHERE property_key = 'shard_count' AND tablegroup_name ='<tg_name>';
    结果:
    shard_count
    -------------
     3
    (1 row)
  4. 查看某Table Group下有哪些表
    SELECT table_namespace AS schema_name, table_name
    FROM hologres.hg_table_properties
    WHERE property_key = 'table_group' AND property_value = '<tg_name>';
    结果:
    schema_name | table_name
    -------------+------------
     public      | a
    (1 row)
  5. 查看某张表所在的Table Group
    SELECT property_value AS table_group_name
    FROM hologres.hg_table_properties
    WHERE property_key = 'table_group' AND table_name = '<table_name>';
    结果:
    table_group_name
    ------------------
     test_tg_default
    (1 row)

新建Table Group

若是有新上的业务或者需要重新创建Table Group并指定新的Shard数,可以使用以下命令语句。
说明
  • 新建Table Group后,原来的表和数据还会在原Table Group中,不会默认迁移到新的Table Group中。
  • 需要将原来表和数据都迁移至新的Table Group或者删除,原Table Group才会失效。
CALL HG_CREATE_TABLE_GROUP ('<new_tg_name>', <shard_count>);
参数说明如下:
参数 类型 说明
new_tg_name Text 新建的Table Group名。
shard_count INT4 Table Group对应的Shard数。
使用示例:
-- 新建一个Shard数为8的新Table Group,命名为tg_8
CALL HG_CREATE_TABLE_GROUP ('tg_8', 8);

修改默认Table Group

新建一个数据库后,实例会有一个默认Table Group,以及默认的Shard数。详情请参见实例规格概述。若是数据库中有多个Table Group,想要修改默认Table Group,使得后续新建的表存放于新的Table Group中,可以使用如下命令语句。

说明 Hologres实例 V0.9及以上版本执行以下命令语句修改默认Table Group,0.9以下版本请先升级到更高版本。
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', '<tg_name>');
参数说明:
参数 类型 说明
tg_name TEXT 默认Table Group名称,设置后,其Shard count为设置的Table Group的Shard数。
使用示例:
-- 将新创建TG设为默认Table Group,后续新建的表,将默认使用新的Table Group (v0.9以上)
CALL HG_UPDATE_DATABASE_PROPERTY ('default_table_group', 'tg_8');

将新建表放入指定Table Group

可以通过以下命令语句将新建表,显示放入指定的Table Group中。
BEGIN;
CREATE TABLE table_name (
    col type,
  ....
);
CALL SET_TABLE_PROPERTY('table_name', 'table_group', '<tg_name>');
COMMIT;
参数说明:
参数 类型 说明
table_name TEXT 新建的表名。
tg_name TEXT 默认Table Group名称,设置后,其Shard Count为设置的Table Group的Shard数。
使用示例:
-- 新建表tbl1并直接关联名为tg_8的Table Group
BEGIN;
CREATE TABLE tbl1 (
    col1 text
);
CALL SET_TABLE_PROPERTY('tbl1', 'table_group', 'tg_8');
COMMIT;

(Resharding)迁移表至新建Table Group

在Hologres中,Shard用于提升数据处理的并发度,合理的设置Shard数,有利于提高查询或者写入的性能。一般情况下,Hologres实例默认的shard数已经能满足大部分场景,无需再手动修改。

当实例扩容后,例如32core扩容到128core,该数据库的Shard数不会随着扩容默认更改,因此建议您针对该数据库增加Shard数,以获取更好的性能。如果是该实例下新建的DB,其Shard数为当前规格的默认数量。实例规格与Shard的相关描述,请参见实例规格概述

当实例扩容或者缩容后,其之前DB的Shard数不会自动随之增加或减少,需要通过命令语句设置Shard数,并重新进行数据导入。Resharding功能用于修改Shard数后,自动实现Rebalance的功能,无需再重新建表导数据,即可将原来的表和数据Resharding到各Shard上,简化操作步骤,实现最优性能。

  • 使用限制
    • 仅Hologres V0.10 及以上版本支持Resharding,请前往Hologres管控台的实例详情页查看当前实例版本,如果您的实例是V0.10以下版本,请您提交工单升级实例。
    • 目前Resharding是单表级别,当使用Resharding时,需要停止该表的写入(如Flink、数据集成等写入),对表的查询不受影响。
    • Resharding会消耗一定的资源,建议在业务低峰期处理。
    • 如果表开启了Binlog,请在Resharding之前关掉Binlog,待Resharding完成后再开启Binlog,详细操作请参见订阅Hologres Binlog
  • 语法示例
    可以通过以下命令将业务的部分表迁移至新建的Table Group。
    说明
    • 在迁移之前,需要有一个新建的Table Group,若是没有新建Table Group,请参见新建Table Group进行新建。
    • 表迁移时需要停止对该表的写入,查询不受影响。
    • 原Table Group的表全部迁移后,原Table Group将会被自动删除。若是因为业务需求需要建立多个Table Group,建议合理设置每个Table Group的Shard数。
    • 表迁移时分区表只需要操作父表即可。
    -- V1.1及以上版本命令语法
    CALL HG_MOVE_TABLE_TO_TABLE_GROUP('<table_name>','<new_table_group_name>');
    
    -- V.10版本命令语法
    CALL HG_UPDATE_TABLE_SHARD_COUNT('<table_name>','<new_table_group_name>');
  • 参数说明
    参数 说明 示例
    table_name 需要迁移的表名。一次命令仅支持单表迁移,若是有多个表,需要多次执行。分区表只需要操作父表即可。 new_table
    table_group_name 新的Table Group名。 new_tg

删除Table Group

可以通过以下命令语句删除空的Table Group。如果Table Group有表存在,则无法删除。
CALL HG_DROP_TABLE_GROUP('<tg_name>');
使用示例:
--删除名为tg_8的Table Group
CALL HG_DROP_TABLE_GROUP('tg_8');

使用最佳实践

Table Group是比较高级的功能,一般情况下,不建议业务新建Table Group以及修改Shard数。若是因为业务有不同的需求,可以按照最佳实践合理规划,详情请参见Table Group设置最佳实践