更新时间:2026-08-06 GMT+08:00
自动调度
以下为后台自动调度压缩的测试步骤,过程中的表可替换为自己的表数据进行测试,注意提前做好备份。
- 执行如下命令,打开GUC参数enable_ilm,命令如下。
gs_guc reload -Z datanode -Z coordinator -I all -N all -c 'enable_ilm=on'
- 使用初始用户gsql连接CN登录数据库,创建维护窗口。
gaussdb=# \c template1 template1=# DECLARE V_HOUR INT := 22; V_MINUTE INT := 0; V_SECOND INT := 0; C_ADO_WINDOW_SCHEDULE_NAME TEXT := 'ado_window_schedule'; C_ADO_WINDOW_PROGRAM_NAME TEXT := 'ado_window_program'; C_MAINTENANCE_WINDOW_JOB_NAME TEXT := 'maintenance_window_job'; V_MAINTENANCE_WINDOW_REPEAT TEXT; V_MAINTENANCE_WINDOW_START TIMESTAMPTZ; V_BE_SCHEDULE_ENABLE BOOL; V_MAINTENANCE_WINDOW_EXIST INT; BEGIN SELECT COUNT(*) INTO V_MAINTENANCE_WINDOW_EXIST FROM PG_CATALOG.PG_JOB WHERE JOB_NAME = 'maintenance_window_job' AND DBNAME = 'template1'; IF CURRENT_DATABASE() != 'template1' THEN RAISE EXCEPTION 'Create maintenance_window FAILED, current database is not template1'; END IF; IF V_MAINTENANCE_WINDOW_EXIST = 0 AND CURRENT_DATABASE() = 'template1' THEN SELECT CASE WHEN NOW() < CURRENT_DATE + INTERVAL '22 HOUR' THEN CURRENT_DATE + INTERVAL '22 HOUR' ELSE CURRENT_DATE + INTERVAL '1 DAY 22 HOUR' END INTO V_MAINTENANCE_WINDOW_START; --1. prepare for maintenance window schedule SELECT 'freq=daily;interval=1;byhour='||V_HOUR||';byminute='||V_MINUTE||';bysecond='||V_SECOND INTO V_MAINTENANCE_WINDOW_REPEAT; BEGIN SELECT CASE WHEN VALUE = 1 THEN TRUE -- DBE_ILM_ADMIN.ILM_ENABLED ELSE FALSE END INTO V_BE_SCHEDULE_ENABLE FROM PG_CATALOG.GS_ILM_PARAM WHERE IDX = 7; -- DBE_ILM_ADMIN.ENABLED EXCEPTION WHEN OTHERS THEN V_BE_SCHEDULE_ENABLE := FALSE; END; --2. Create ado window schedule DBE_SCHEDULER.CREATE_SCHEDULE( SCHEDULE_NAME => C_ADO_WINDOW_SCHEDULE_NAME, START_DATE => '9999-01-01 00:00:01', REPEAT_INTERVAL => NULL, END_DATE => NULL, COMMENTS => 'ado window schedule'); --3. Create ado window program DBE_SCHEDULER.CREATE_PROGRAM( PROGRAM_NAME => C_ADO_WINDOW_PROGRAM_NAME, PROGRAM_TYPE => 'plsql_block', PROGRAM_ACTION => 'call prvt_ilm.be_execute_ilm(0);', NUMBER_OF_ARGUMENTS => 0, ENABLED => TRUE, COMMENTS => NULL); --4. Create maintenance window master job DBE_SCHEDULER.CREATE_JOB( JOB_NAME => C_MAINTENANCE_WINDOW_JOB_NAME, START_DATE => V_MAINTENANCE_WINDOW_START, REPEAT_INTERVAL => V_MAINTENANCE_WINDOW_REPEAT, END_DATE => NULL, JOB_TYPE => 'STORED_PROCEDURE'::TEXT, JOB_ACTION => 'prvt_ilm.be_active_ado_window'::TEXT, NUMBER_OF_ARGUMENTS => 0, ENABLED => V_BE_SCHEDULE_ENABLE, AUTO_DROP => FALSE, COMMENTS => 'maintenance window job', destination_name=> 'CCN'); UPDATE PGXC_NODE SET NODEIS_CENTRAL = 't' WHERE NODE_NAME = GET_NODEINFO('node_name'); END IF; END; /执行结果示例如下:

- 切换普通用户gsql连接CN登录数据库,创建带ILM策略的表,并插入数据(此步可替换为自己的表数据,添加ILM策略进行压缩测试)。
template1=# CREATE DATABASE adb; template1=# \c adb adb=# ALTER DATABASE SET ILM = on; adb=# CREATE TABLE t1 (id int) WITH (orientation=row, compression=no, storage_type=astore) ILM ADD POLICY ROW STORE COMPRESS TURBO low UNIT AFTER 3 DAYS OF NO MODIFICATION; adb=# INSERT INTO t1 SELECT * FROM generate_series(1, 10000000);
执行结果示例如下:

不支持系统表、全局临时表、本地临时表和序列表,不支持段页式表,不支持hashbucket表,不支持unlogged表,不支持IMCV表,不支持压缩toast数据。
- 配置ilm自动调度系统参数(该操作只在测试场景下建议修改,正常使用时不建议修改)。 调用DBE_ILM_ADMIN.CUSTOMIZE_ILM接口来修改调度相关的系统参数,分别传入参数对应的id以及value。这里修改了三条数据,分别是将自动调度执行频率修改为1分钟1次、将数据变冷行的时间单位修改成秒、将每个压缩job每次压缩的数据量大小设置为10M。其他参数可以不用修改,使用默认配置即可。gs_ilm_param表参数说明请参见《参考》中“存储过程 > 高级包 > 二次封装接口(推荐) > DBE_ILM_ADMIN”章节中“DBE_ILM_ADMIN.CUSTOMIZE_ILM接口参数范围”表。
adb=# \c adb adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(1, 1); adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 1); adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 10);
执行结果示例如下:

- 等待3秒让数据变冷行之后,开启自动调度。
adb=# \c adb adb=# SELECT pg_sleep(3); adb=# CALL DBE_ILM_ADMIN.DISABLE_ILM(); adb=# CALL DBE_ILM_ADMIN.ENABLE_ILM(); adb=# \c template1 template1=# CALL DBE_SCHEDULER.set_attribute('maintenance_window_job','start_date',NOW());执行结果示例如下:

- 查询调度任务的压缩结果。
template1=# \c adb adb=# CALL dbe_compression.get_actual_compression_ratio( 'public', 't1', a,b,c,d,e,f); adb=# SELECT * FROM gs_adm_ilmresults ORDER BY task_id DESC;
执行结果示例如下:
调度任务一分钟执行一次,所以每隔一分钟才会生成一个新的压缩job。压缩率值越大表示压缩收益越大。


- 测试完成后,建议恢复gs_ilm_param参数为初始值。
adb=# BEGIN DBE_ILM_ADMIN.CUSTOMIZE_ILM(1, 15); DBE_ILM_ADMIN.CUSTOMIZE_ILM(11, 0); DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 1024); DBE_ILM_ADMIN.DISABLE_ILM(); --关闭自动调度 END; /