GaussDB(DWS)运维 -- 小CU生成逻辑与常见解决方案
【摘要】 描述DWS产生小CU的场景
小 CU 场 景 分 析 | ||||
基础概念 | 什么叫小CU? | DWS的列存表最小存储单元是CU(Compress Unit),每个CU的大小为8KB的整数倍(需要注意的是,CU并不是由页组成的,它是一个独立的存储单元),最多存储1列60000行数据。同一列的多个CU连续存放在一个数据文件中,当数据文件的大小超过1G,会自动切换到新的文件中。 | ||
CU更新机制 | 在列存表上进行delete时,首先会根据删除条件找到需要删除的行ctid(cu_id,offset),然后对需要删除的行ctid去重(每420万行排序去重),最后在行对应的VCU的delete map上打上删除标记。至于update操作,实际上是一个delete+insert(append)操作。首先根据更新条件找到更新的行,打上删除标记(ctid需去重),然后将原来整行更新相应数据后,插入到新CU中。因此列存表更新/删除时对于CU上原始位置的数据没有被清理,还占用实际的磁盘空间 | |||
小CU的危害 | 1.压缩率低 2.空间膨胀 |
|||
如何判断小CU? | DWS提供接口函数get_col_cu_info做单表的CU中的数据量的统计,默认情况下单个CU中的可见记录数小于2000条就被认为是小CU |
|||
场景 | 场景编号 | 场景简述 | 详述 | 处理方案 |
数据导入 | I-1 | 单条导入 | 此场景主要是因为前段使用单条INSERT语句插入数据,导致每个INSERT语句在某一个DN上产生一个CU,每个CU里面只有一条数据,CU空间严重浪费,导致表的size变大。 注意:JDBC等驱动模式下的batch INSERT底层还是执行的单条INSERT语句,因此也在此场景之列 |
A-1 |
I-2 | COPY | 此场景主要是业务侧通过数据同步工具进行COPY微批导入,业务侧为了控制数据导入延迟,或者避免单次导入数据量过大对数据导入工具的内存占用,一般都会控制单次COPY的数据量。控制的方法为设置单批次导入的数据量上限(一般不会太大,都是几百到几千条),或者设置单批次导入数据的积累时间(比如接受前端给数据同步工具发送的10s内的数据)上限。 DWS为分布式数据库,数据会被打散分布到各个DN,每批次的数据分配到每个DN上的数据量可能只有几十条,导致形成小CU |
A-1 | |
数据加工 | M-1 | 不下推的批量导入 | 此场景主要出现在批量加工场景时,往目标表进行INSERT INTO SELECT操作。这种场景一般不会形成小CU。但是如果这个语句是不下推的,那么就会导致小CU。这种语句的执行计划一般有如下特征 |
A-1 |
M-2 | 频繁更新 | 更新(UPDATE/DELETE/MERGE)频繁的表,导致已有CU的数据不断删除,最终导致每个CU里面的数据量变小 | A-2 |
不同场景对应的解决方案
场景编号 | 处理方案 | 具体方案 |
I-1 I-2 |
方案1 | 1.目标表修改为hstore,具体语法参见 https://support.huaweicloud.com/devg-820-dws/dws_04_1029.html |
方案2 | 把数据导入分拆为两个步骤 1.把数据导入一个普通行存表A 2.当表A的数据量积累到一定程度,把行存表A的数据导入最终目标表 |
|
方案3 | 如果目标表是分区表,且最新导入的数据总是在最新目标表中,建议在数据导入完成后对最新的分区最VACUUM FULLL操作 | |
M-1 | 方案1 | 解决INSERT语句中的不下推因素 |
M-2 | 方案1 | 如果目标表是分区表,且更新操作总是在最新分区上进行,建议抽取时机(无数据访问,且小CU积累的足够多)对分区做VACCUM FULL |
方案2 | 如果目标表是普通表,建议抽取时机(无数据访问,且小CU积累的足够多)对表做VACCUM FULL |
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)