Greenplum清理垃圾、修改存储模式(行存储改列存储)平滑方法

1.背景

  1. 在使用Greenplum的过程中,如果业务会经常对数据进行更新,删除,插入,可能导致数据出现膨胀。
  2. 用户在建表的时候,存储模式选择不当,但是业务已经运行了一段时间,表里面已经写入了大量的数据。
  3. 用户在建表的时候,分布键选得不对,但是业务已经运行了一段时间,表里面已经写入了大量的数据。
  4. 用户在建表的时候表分区做得不对,但是业务已经运行了一段时间,表里面已经写入了大量的数据。
  5. 数据分区在初期选择了行存储,为了提到明细查询的效率。但是到数据冷却后,明细查询的需求下降,更多的是统计查询的需求,那么需要将这样的冷分区的行存储转换成列存储,提高统计的效率。
  6. 数据在使用过程中,由于分布键的数据在业务层发生了一些变化,导致了数据存储的倾斜。

以上情况发生时,我们就有必要进行相应的行动:

清理垃圾、调整分布键、分区键、修改存储模式等。

那么,有什么方法可以让这些操作尽量的减少对业务的影响呢?

答案是 交换数据交换分区

2.知识点

2.1 查看存储格式、分布键

Greenplum 6版本变化很大,以前很多查询语句都不能用。


select n.nspname AS                      模式名,
       c.relname AS                      表名,
       case
           when c.relstorage = 'c' then '列存储'
           when c.relstorage = 'h' then '行存储'
           when c.relstorage = 'a' then 'OA行存储'
           end                           存储类型,
       case
           when p.policytype = 'p' then '分区表'
           when p.policytype = 'r' then '复制分布'
           end                           分布策略,
       pg_get_table_distributedby(c.oid) 分布键,
       c.reloptions                      压缩类型
from pg_class c
         left join gp_distribution_policy p on c.oid = p.localoid
         left join pg_namespace n on c.relnamespace = n.oid
where n.nspname = 'public';

2.2 查看分区

select * from pg_partitions where tablename='tbl_order';

3.单表存储模式转换(行存转列存、列存转行存)

示例:对tbl_order_h表进行行存储转换为列存储。


-- 根据行表创建列表
CREATE TABLE tbl_order_c (LIKE tbl_order_h) WITH (appendonly=true,compresslevel=1, orientation=column);  
-- 插入行表数据到列表
INSERT INTO tbl_order_c SELECT * FROM tbl_order_h;  
-- 授权admin所有权限
GRANT ALL PRIVILEGES ON tbl_order_c TO admin;  
-- 授权给guest查询权限
GRANT SELECT ON tbl_order_c TO guest;

4.交换分区

未完待续


Greenplum清理垃圾、修改存储模式(行存储改列存储)平滑方法
https://www.gmtgo.com/8029.html
作者
大帅
发布于
2022年12月22日
许可协议