手动调度
以下为手动调度压缩的测试步骤,过程中的表可替换为自己的表数据进行测试,注意提前做好备份。
- 执行如下命令,打开GUC参数enable_ilm,命令如下。
gs_guc reload -Z datanode -Z coordinator -I all -N all -c 'enable_ilm=on'
- 使用普通用户通过gsql连接CN登录数据库,执行如下命令,打开ILM特性。
gaussdb=# ALTER DATABASE SET ilm = on;
- 执行如下命令,修改ilm的时间单位为秒(该操作只在测试场景下建议修改,正常使用时不建议修改)。
这一步的操作主要是为了加快测试速度。ilm默认的时间单位为天,执行手动压缩时,第一次调度是打时间戳,第二次调度才能压缩,第一次调度和第二次调度的间隔需要超过冷热数据判定时间的阈值才会执行压缩,以秒为时间单位可以加快测试速度(这里的第一次任务默认可以扫描完全表,若不能则需调度多次全表都扫描后,完成扫描后再次调度才有压缩收益)。
- 修改ilm的时间单位为秒。
gaussdb=# BEGIN DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 1); END; /
- 查看修改结果。
gaussdb=# SELECT * FROM GS_ILM_PARAM;
执行结果示例如下:

gs_ilm_param表参数说明请参见《参考》中“存储过程 > 高级包 > 二次封装接口(推荐) > DBE_ILM_ADMIN”章节中“DBE_ILM_ADMIN.CUSTOMIZE_ILM接口参数范围”表。
- 修改ilm的时间单位为秒。
- 执行如下命令,修改一次调度最多压缩的数据大小(可选,根据业务表大小自行判断)。
本示例以修改为4GB为例。
gaussdb=# BEGIN DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 4096); END; / - 建立带有ILM策略的表(此步可替换为自己的表数据,添加ILM策略进行压缩测试)。
- 方法一:建表的同时添加策略。
“3 DAYS OF NO MODIFICATION”是判定冷数据的时间阈值。
gaussdb=# CREATE TABLE t ( id1 int, id2 int, id3 int, id4 int) WITH (orientation=row, compression=no, storage_type=astore) ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;
- 方法二:先建表再添加策略。
gaussdb=# CREATE TABLE t ( id1 int, id2 int, id3 int, id4 int) WITH (orientation=row, compression=no, storage_type=astore); ALTER TABLE t ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;
不支持系统表、全局临时表、本地临时表和序列表,不支持Ustore段页式表,不支持unlogged表,不支持IMCV表,不支持压缩toast数据。
- 方法一:建表的同时添加策略。
- 执行如下命令插入数据。
gaussdb=# INSERT INTO t (id1, id2 ,id3 , id4) SELECT s, s, s, s FROM generate_series(1, 1000000) AS s;
- 执行如下命令查看表t的原始大小,记为size1,本示例中size1 = 42MB。
gaussdb=# \d+
或者
gaussdb=# SELECT pg_relation_size('t');执行结果示例如下:

- 执行压缩。
- 先执行如下命令。
gaussdb=# DECLARE v_taskid number; BEGIN DBE_ILM.EXECUTE_ILM('public','t',v_taskid,NULL,'ALL POLICIES',2); END; / - 等待一段时间后,执行下面命令推进xmin后,通过gs_txid_oldestxmin()函数检查xmin以确保其有所推进,然后再次输入8.a中的命令。
gaussdb=# SELECT gs_txid_oldestxmin(); gaussdb=# CREATE TABLE temp(id int); gaussdb=# INSERT INTO temp VALUES(1); gaussdb=# INSERT INTO temp VALUES(1); gaussdb=# DROP TABLE temp; gaussdb=# SELECT gs_txid_oldestxmin();
- 查询压缩结果。
gaussdb=# SELECT * FROM GS_ADM_ILMRESULTS ORDER BY task_id DESC;
执行结果示例如下:

可以看到,gs_adm_ilmresults打印了一些压缩信息,statistics列中SpaceSaving打印的即为本次压缩所节省的字节大小。
- 先执行如下命令。
- 8中实际节约的空间并不一定能被完全复用,需要再次插入一份同样的数据测试真实压缩比,在二次插入数据后再次查看表t占用的空间。
- 插入数据。
gaussdb=# INSERT INTO t SELECT * FROM t;
- 查询表t的大小,记为size2,本示例中size2 = 72MB。
gaussdb=# \d+
或者
gaussdb=# SELECT pg_relation_size('t');执行结果示例如下:

- 插入数据。
- 根据第一次插入数据和第二次插入数据后表t占用的空间计算压缩比。
压缩比 = size1 / (size2 – size1) = 42 / (72 - 42) = 1.40
- 测试完成后,建议恢复gs_ilm_param参数为初始值。
gaussdb=# BEGIN DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 0); DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 1024); END; /