=====这是一个广告位,招租中,联系qq 78315851====
2 条回复 A 作者 M 管理员
  1. 目前adb只支持通过设置生命周期的方式进行分区,还不支持range、list、hash、key等MySQL支持的分区。 此回答整理自钉群“云数据仓库ADB-开发者群”

  2. ADB 2.0支持两级分区策略,一级分区采用HASH算法,单表数据量在60亿条以内;二级分区采用LIST算法,单表最大二级分区1095个。 目前ADB 3.0只支持一级分区。一级分区数不能超过256个。 不支持多列作为分区列。 没有限定最大分区数,系统会自动调整到最优值。 维度表没有分区定义,只有普通标有分区。

    一张事实表至少有一级Hash分区并且分区数不能小于8个; 一个事实表最多不能超过1024个列。

    ADB的事实表支持二级分区策略,一级分区采用 HASH 算法,二级分区采用 LIST 算法。通过二级分区策略,ADB可将表数据分布到不同的节点。

    在ADB中,设置一级分区的目的是将数据均匀分散到多个 CN 节点当中,以便充分发挥ADB分布式计算的能力。设置二级分区的目的是将数据分散到不同的存储文件上,与传统数据库的分区相似。

    ADB的表一级分区采用 HASH 分区,可指定任意一列(不支持多列)作为分区列。HASH 分区通过标准 CRC 算法计算出 CRC 值,并将 CRC 值与分区数作模计算,得出每条记录的分区号。空值的 HASH 值与字符串-1的 HASH 值相同。

    在ADB中,一级分区列的选择依据(按优先级从高到低排序)如下:

    如果是多个事实表(不包括维度表)JOIN,则选择参与 JOIN 的列作为分区列。如果是多列 JOIN ,则根据查询重要程度或查询性能要求(例如:某 SQL 的查询频率特别高)来选择分区列,以保证基于分区列的 JOIN 具有较好的查询性能。

    选择 GROUP BY 或 DISTINCT 包含的列作为分区列。 选择值分布均匀的列作为分区列,请勿选择分区倾斜的列作为分区列。 如果常用的 SQL 包含某列的等值或 IN 查询条件,则选择该列作为分区列。

    ADB的 LM 计算引擎是大部分查询所使用的计算引擎,它会在每个分区并行计算,每个分区计算使用一个线程,分区计算结果汇总到 FRONTNODE 。因此,如果分区数过小,则会导致并发低、单查询 RT时间长;如果分区数过多,则会导致计算结果数过多、增加FRONTNODE压力,并且容易产生长尾效应。

    实际进行一级分区时,您需要根据资源配置和查询特点,选择合适的分区数。一级分区个数选择依据如下:

    注意一级分区数不可修改。如需修改,必须删表重建。

    参与快速 JOIN 的所有事实表的分区数必须相同。 每个一级分区的数据记录数建议为300万条到2000万之间。如果有二级分区,则保证一级分区下的每个二级分区的记录数在300万条到2000万条之间。

    一级分区数应该大于ECU数量 * 6,同时需要考虑到后续的扩容需求。例如:某数据库资源是8个 C8,则分区数需要大于8 * 6 = 48。但分区数也要小于一定的值,实际分区时,也容易出现划分一级分区过多的情况,例如:两个 ECU 的情况下,设置了128个一级分区。 单表一级分区数最大值为256。如果需要设置成更大,请联系技术支持人员。

    单计算节点的分区数(包括二级分区)不能超过10000。

    设置一级分区数时,除以上依据外,您还需要特别注意以下问题:

    一级分区数过多,例如:某数据库只有8个节点,但表的一级分区设置为了256,此情况一般出现在开发环境中。实际划分一级分区时,您需要根据实际环境的节点个数来规划一级分区数。 一级分区数过小,例如:某数据库有32个节点,但一级分区数设置为了8。如果数据库中有一个超过一亿记录数的表,则表数据会集中在8节点上,容易导致这8个节点出现存储空间不足、查询慢等问题。

    每个一级分区下会包含多个二级分区。二级分区主要用于解决数据表需要按固定时间周期(例如:天、周、月、年)增加数据的问题,同时二级分区还考虑了保留一定时间范围的历史数据。

    二级分区采用 LIST 分区,不同值的个数即为二级分区数。二级分区列是数据表中的一个 bigint 类型的列,通常为 bigint 类型的日期,例如:2017091210。

    在ADB中,二级分区采用 LIST 算法实现单节点数据的二次分表,最终实现大数据表存储容量的扩展。二级分区键采用 bigint 数据类型,键值一般采用业务数据对应的值,例如:按日存储,数据字段为data_time=2017-01-01,则对应的二级分区键值为pt=20170101。二级分区个数即 select count(distinct pt) from table_name;的返回值。

    二级分区支持自动清除历史数据。ADB内部会定期检查表的二级分区个数,当对表进行 optimize(自动或手工方式)操作时,如果表的二级分区数超过设定的值,则按二级分区键值大小排序来删除最早的二级分区。

    在使用ADB的过程中,您必须防止垃圾数据自动清除有效数据。当误删有效数据时,请立即联系ADB的技术支持来恢复数据。