在greenplum里面有一种appendonly表,只能insert,不能update、delete的一种表。压缩表、列存储表,必须是appendonly的表。下面介绍appendonly表的一些特性。
1.首先建一张appendonly的表:
[sql] view plaincopy
1. aligputf8=# create table cxf_test1 with(appendonly=true,compresslevel=5) as select generate_series(0,1000) a,’helloworld’::varchar(50) b distributed by (a);
2. SELECT 1001
2.查一下表的oid:
oid: 行的对象标识符(对象 ID)。这个字段只有在创建表的时候使用了 WITH OIDS ,或者是设置了default_with_oids 配置参数时出现。 这个字段的类型是 oid (和字段同名)。
[sql] view plaincopy
1. aligputf8=# select oid from pg_class where relname=’cxf_test1′;
2. oid
3. ——–
4. 383660
5. (1 row)
6.
7. aligputf8=# select oid,oid::regclass from pg_class where relname=’cxf_test1′ or relname like ‘%383660%’;
8. oid | oid
9. ——–+——————————–
10. 383665 | pg_aoseg.pg_aoseg_383660
11. 383666 | pg_aoseg.pg_aoseg_383660_index
12. 383660 | cxf_test1
13. (3 rows)
在gp3.3.*的版本里面,aoseg表的信息是记录在pg_class中的relaosegrelid 字段,是以这个为准的
[sql] view plaincopy
1. aligputf8=# select relaosegrelid from pg_class where relname=’cxf_test1′;
2. relaosegrelid
3. —————
4. 383665
5. (1 row)
在gp4.*的版本里面,pg_class的relaosegrelid 字段已经取消掉了,这个信息保留在了pg_appendonly表中的segrelid字段中了。
3.aoseg表的字段信息
[sql] view plaincopy
1. aligputf8=# \d pg_aoseg.pg_aoseg_383660
2. “pg_aoseg.pg_aoseg_383660″
3. Column | Type
4. —————–+——————
5. segno | integer
6. eof | double precision
7. tupcount | double precision
8. varblockcount | double precision
9. eofuncompressed | double precision
这个表每个字段的意思gp的文档里面没有,大概觉得每个字段信息应该是:
Segno: 这个字段还不是很清楚,第一次建表的时候是0,truncate之后就变成1了,再truncate还是1。
eof :压缩后文件大小
tupcount:表的函数
varblockcount:表占用的块数量
eofuncompressed:未压缩表的大小
[sql] view plaincopy
1. aligputf8=# select * from gp_dist_random(’pg_aoseg.pg_aoseg_383660′);
2. segno | eof | tupcount | varblockcount | eofuncompressed
3. ——-+—–+———-+—————+—————–
4. 0 | 732 | 161 | 1 | 4204
5. 0 | 728 | 161 | 1 | 4204
6. 0 | 720 | 159 | 1 | 4152
7. 0 | 808 | 181 | 1 | 4724
8. 0 | 796 | 178 | 1 | 4644
9. 0 | 728 | 161 | 1 | 4204
10. (6 rows)
通过gp_dist_random这个函数,我们可以知道gp底层每个数据节点数据量,数据文件大小的情况,这样子我们就能够分析表的数据分布情况,算出倾斜率等。
基于appendonly表,我开发了两个gp的函数:
get_table_count是获取append only表的行数的,appendonly表有一个字段是保存这些信息的。这个函数获取表的函数很快,支持分区表.
[sql] view plaincopy
1. aligputf8=# select * from get_table_count(’rtdc.cxf_test1′);
2. get_table_count
3. —————–
4. 1001
5. (1 row)