阿里云HybridDB for PG实践 - 列存储加字段和默认值

简介:

标签

PostgreSQL , Greenplum , 相对偏移 , 列存储 , appendonly , AO表


背景

Greenplum的Append only table支持更新、删除。通过什么支持呢?bitmap文件,标记被删除的行。

因此在更新,删除后,数据可能膨胀。

另一方面,列存储每列一个文件,同一行通过偏移对应起来。例如INT8的两个字段,通过偏移很快能找到某一行的A列对应的B列。

接下来谈谈加字段,在加字段时,AO表示不会REWRITE TABLE的。如果AO表以及有一些垃圾(被删除的数据)记录后,加的字段会使用相对偏移吗(换句话说,需不需要填充已删除的记录),答案是要填充。

例子

1、创建3张AO列存表。

postgres=# create table tbl1 (id int, info text) with (appendonly=true, blocksize=8192, compresstype=none, orientation=column);  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  
  
postgres=# create table tbl2 (id int, info text) with (appendonly=true, blocksize=8192, compresstype=none, orientation=column);  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  
  
postgres=# create table tbl3 (id int, info text) with (appendonly=true, blocksize=8192, compresstype=none, orientation=column);  
NOTICE:  Table doesn't have 'DISTRIBUTED BY' clause -- Using column named 'id' as the Greenplum Database data distribution key for this table.  
HINT:  The 'DISTRIBUTED BY' clause determines the distribution of data. Make sure column(s) chosen are the optimal data distribution key to minimize skew.  
CREATE TABLE  

2、前两张分别插入1000万记录,最后一张插入2000万记录。

postgres=# insertinto tbl1 select generate_series(1,10000000),'test';  
INSERT 0 10000000  
postgres=# insert into tbl2 select generate_series(1,10000000),'test';  
INSERT 0 10000000  
postgres=# insert into tbl3 select generate_series(1,20000000),'test';  
INSERT 0 20000000  

3、分析表,并记录它们的大小

postgres=# analyze tbl1;  
ANALYZE  
postgres=# analyze tbl2;  
ANALYZE  
postgres=# analyze tbl3;  
ANALYZE  
  
postgres=# select pg_size_pretty(pg_relation_size('tbl1'));  
 pg_size_pretty   
----------------  
 88 MB  
(1 row)  
postgres=# select pg_size_pretty(pg_relation_size('tbl2'));  
 pg_size_pretty   
----------------  
 88 MB  
(1 row)  
postgres=# select pg_size_pretty(pg_relation_size('tbl3'));  
 pg_size_pretty   
----------------  
 173 MB  
(1 row)  

4、更新第一张表,全表更新。并记录更新后的大小,翻了一倍。

postgres=# update tbl1 set info='test';  
UPDATE 10000000  
postgres=# analyze tbl1;  
ANALYZE  
postgres=# select pg_size_pretty(pg_relation_size('tbl1'));  
 pg_size_pretty   
----------------  
 173 MB  
(1 row)  

5、对三个表添加字段,设置默认值。

postgres=# alter table tbl1 add column c1 int8 default 1;  
ALTER TABLE  
postgres=# alter table tbl2 add column c1 int8 default 1;  
ALTER TABLE  
postgres=# alter table tbl3 add column c1 int8 default 1;  
ALTER TABLE  

6、分析表,查看表的大小。

postgres=# analyze tbl1;  
ANALYZE  
postgres=# analyze tbl2;  
ANALYZE  
postgres=# analyze tbl3;  
ANALYZE  
  
postgres=# select pg_size_pretty(pg_relation_size('tbl1'));  
 pg_size_pretty   
----------------  
 325 MB  
(1 row)  
  
postgres=# select pg_size_pretty(pg_relation_size('tbl2'));  
 pg_size_pretty   
----------------  
 163 MB  
(1 row)  
  
postgres=# select pg_size_pretty(pg_relation_size('tbl3'));  
 pg_size_pretty   
----------------  
 325 MB  
(1 row)  

很显然,AO表在添加字段时,以已有文件的记录数为准(即使全部都删除了,也需要在新增字段上初始化这个值),。

如果有相对偏移量的概念,至少tbl2可以忽略前1000万行的偏移。

堆表不存在这个问题,因为堆表加字段会REWRITE全表。

表膨胀的处理

《如何检测、清理Greenplum垃圾 - 阿里云HybridDB for PG最佳实践》

目录
相关文章
|
3月前
|
数据采集 监控 数据管理
什么是数据标准管理?怎么进行数据标准管理?
数据质量问题80%源于“没讲清楚”——客户、销售额、活跃等定义模糊,导致清洗加班、部门扯皮。本质是数据标准缺失!本文详解:什么是数据标准管理?七类标准(术语、数据元、模型、主数据等)如何制定与落地?从统一定义到嵌入系统,让数据真正“说得清、用得准、管得住”。
|
9月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
612 1
Micronaut AOP与代理机制:实现应用功能增强,无需侵入式编程的秘诀
AOP(面向切面编程)能够帮助我们在不修改现有代码的前提下,为应用程序添加新的功能或行为。Micronaut框架中的AOP模块通过动态代理机制实现了这一目标。AOP将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,提高模块化程度。在Micronaut中,带有特定注解的类会在启动时生成代理对象,在运行时拦截方法调用并执行额外逻辑。例如,可以通过创建切面类并在目标类上添加注解来记录方法调用信息,从而在不侵入原有代码的情况下增强应用功能,提高代码的可维护性和可扩展性。
384 2
|
11月前
|
机器学习/深度学习 固态存储 算法
基于MATLAB的图像人数统计
基于MATLAB的图像人数统计
|
6月前
|
存储 弹性计算 缓存
阿里云 8 核 32G 云服务器收费标准、实例规格与价格参考
阿里云8核32G云服务器是主打1:4CPU与内存配比的中高端配置,仅在ECS云服务器系列中推出,无对应轻量应用服务器规格。这个配比让它能兼顾高并发计算和大内存需求,成为中大型企业核心业务的常用选择,同时也能满足部分有中高负载需求的开发者场景,2026年的收费标准会根据实例类型、计费方式、地域选择产生明显差异,优惠活动则覆盖新老用户和企业群体,整体定价和福利都围绕不同业务的实际使用需求做了细分。
566 13
|
10月前
|
JSON Dubbo 网络协议
1.Dubbo(缺省默认)
Dubbo缺省协议采用单一长连接和NIO异步通信,适合小数据量高并发场景,消费者多于提供者。不适用于大数据传输,如文件或视频,除非请求量低。支持多种传输器、序列化方式和线程池策略。特性包括基于Mina和Hessian的交互、单连接、长连接、TCP传输、NIO异步、Hessian序列化等。适用于常规远程服务调用,但参数和返回值需实现Serializable接口,不能自定义集合类。配置灵活,支持多端口和连接数控制,保障服务提供者的稳定性。
1.Dubbo(缺省默认)
|
人工智能 搜索推荐
手绘与文字的完美结合:阿里的通义万相涂鸦作画体验分享
木头左介绍涂鸦作画,一个融合AI的绘画工具,让用户通过简单手绘和文字描述创造个性化艺术作品。用户需注册登录后,利用画笔、橡皮等功能创作,并能根据文字描述自动生成画作。涂鸦作画简单易用,有丰富素材库,生成效果出色,有望在教育、设计等领域广泛应用。
|
敏捷开发 监控 数据可视化
如何管理复杂项目?Cynefin框架,Stacey矩阵和CAS实战指南
本文将详细介绍 Cynefin 框架、Stacey 矩阵 和 复杂适应系统模型CAS,高效应对复杂项目。
875 1
如何管理复杂项目?Cynefin框架,Stacey矩阵和CAS实战指南
|
存储 数据挖掘
服务器数据恢复—ZFS文件系统下数据恢复案例
服务器存储数据恢复环境: ZFS Storage 7320存储阵列中有32块硬盘。32块硬盘分为4组,每组8块硬盘,共组建了3组RAIDZ,每组raid都配置了热备盘。 服务器存储故障: 服务器存储运行过程中突然崩溃,排除人为误操作、断电、进水和其他机房不稳定因素。管理员重启服务器存储,系统无法进入,需要恢复服务器存储中的数据。
LabVIEW应用程序(EXE)无法正确动态调用插件
LabVIEW应用程序(EXE)无法正确动态调用插件
572 1