gp中某个AO行存表在节点上的数据文件可能表现为如下,即有多个空的数据文件也有多个有记录的数据文件。
-rw------- 1 gpadmin gpadmin 0 Mar 30 14:25 32930.6
-rw------- 1 gpadmin gpadmin 0 Mar 30 14:25 32930.5
-rw------- 1 gpadmin gpadmin 0 Mar 30 14:25 32930.4
-rw------- 1 gpadmin gpadmin 1737344 Mar 30 14:25 32930.1
-rw------- 1 gpadmin gpadmin 18602616 Mar 30 14:25 32930.2
一、gp在vacuum时对AO表的处理
greenplum中的AO表与从postgreSQL中继承的heap表在vacuum时的处理完全不同。AO表没有记录FSM,采用重写为新的数据文件来处理数据记录中的无效数据。AO表在vacuum full 时,在存在无效数据时(即使只有一条),也会生成一个新的数据文件,重写数据到该文件中,并删除原有的数据文件;在不存在无效数据时,只会生成空的数据文件,但不会重写数据文件。
重写数据文件的过程如下:
[gpadmin@sdw1 16384]# ls -l |grep 25020
-rw------- 1 gpadmin gpadmin 0 Mar 29 14:59 25020
-rw------- 1 gpadmin gpadmin 23955104 Mar 29 15:12 25020.1
[gpadmin@sdw1 16384]# ls -l |grep 25020
-rw------- 1 gpadmin gpadmin 0 Mar 29 14:59 25020
-rw------- 1 gpadmin gpadmin 23586656 Mar 29 15:28 25020.1
-rw------- 1 gpadmin gpadmin 20160456 Mar 29 15:28 25020.2
[gpadmin@sdw1 16384]# ls -l |grep 25020
-rw------- 1 gpadmin gpadmin 0 Mar 29 14:59 25020
-rw------- 1 gpadmin gpadmin 20160456 Mar 29 15:28 25020.2
AO表在vacuum时,首先会检查无效数据占总数据的比例是否达到阈值(阈值默认是10%),达到阈值则重写数据文件,否则会跳过重写操作。vacuum时跳过重写操作的日志中记录如下:
"Append-only compaction skipped on relation faa_otp_load, segment file num 1","Ratio of obsolete tuples below threshold (3% vs 10%)",,,,,"VACUUM faa_otp_load;"
阀值是由gp_appendonly_compaction_threshold设定的。
gpadmin=# show gp_appendonly_compaction_threshold;
gp_appendonly_compaction_threshold
------------------------------------
10
(1 row)
AO行存表和AO列存表在对待vacuum时的处理是一致的,只不过列存表每个字段都会有自己的数据文件,vacuum操作都会产生额外的数据文件。
二、多个空的数据文件产生的原因
根据GP的MPP特性,数据是分布在多个数据节点上的。删除数据后,vacuum时,可能不同的节点上无效数据有的达到了阀值(10%的无效数据),而有的没有达到阀值,无效数据达到了阀值的节点上的数据文件会重写,而没有达到阀值的节点上的数据文件不会重写。而这些的数据文件都需要保存下来,此时就会有多份数据文件存在,而且很多是空的。AO表在vacuum时,处理有以下规律,
1,需要重写文件的数据节点,实际存储数据的相同的文件名(尾编号一致,如上面的32930.2)会对应重写数据文件到新的文件如所有的tab.x会写到tab.y,而所有的tab.n会写到tab.m
2,新生成的文件会在所有的节点上生成,即使该节点不需要重写文件。
3,新生成的文件的尾编号不会使用现在任何一个节点上实际存储数据的文件的尾编号。
4,重写数据文件后都会删除原有的数据文件。
一个4节点的集群,某个AO行存表产生多个空文件的过程示例如下(记录的为尾编号):
见附件,其中红色为实际存储数据的文件,绿色为空文件,d1,va表示删除1号节点上的数据并让其达到阈值然后vacuum.
三、多个有记录的数据文件产生的原因
AO表在vacuum发生了重写后,进行insert操作,新的数据是写到默认的数据文件中如XXX.1中。
刚进行vacuum后的某行存表在某个节点上的数据文件
-rw------- 1 gpadmin gpadmin 20167320 Mar 31 14:51 33459.2
插入数据到该表在某个节点上就会有两个文件实际存储数据,如下所示:
-rw------- 1 gpadmin gpadmin 20167320 Mar 31 14:51 33459.2
-rw------- 1 gpadmin gpadmin 4979592 Mar 31 15:19 33459.1
此时删除新加入的数据中的大量数据,再进行vaccum,则该文件会重写
-rw------- 1 gpadmin gpadmin 20167320 Mar 31 15:20 33459.2
-rw------- 1 gpadmin gpadmin 3228696 Mar 31 15:20 33459.3
-rw------- 1 gpadmin gpadmin 0 Mar 31 15:20 33459.4
此时再插入数据就会有三个文件实际存储数据。
-rw------- 1 gpadmin gpadmin 20167320 Mar 31 15:20 33459.2
-rw------- 1 gpadmin gpadmin 3228696 Mar 31 15:20 33459.3
-rw------- 1 gpadmin gpadmin 0 Mar 31 15:20 33459.4
-rw------- 1 gpadmin gpadmin 1752320 Mar 31 15:22 33459.1
四、合并数据文件
将该表reorganize可以合并数据文件。
alter table table_name set with (reorganize=true);