
# 自动调度
以下为后台自动调度压缩的测试步骤，过程中的表可替换为自己的表数据进行测试，注意提前做好备份。
1. 执行如下命令，打开GUC参数enable_ilm，命令如下。 
   ```
   gs_guc reload -Z datanode -Z coordinator -I all -N all -c 'enable_ilm=on'
   ```
   
   

2. 使用初始用户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;
   /
   ```
   执行结果示例如下：
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002590205950.png "点击放大")
   
   
3. 切换普通用户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 ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;
   adb=# INSERT INTO t1 SELECT * FROM generate_series(1, 10000000);
   ```
   执行结果示例如下：
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002620645571.png "点击放大")
   或者在已有表基础上，直接添加ILM策略。
   ```
   adb=# ALTER TABLE xxx ILM ADD POLICY ROW STORE COMPRESS ADVANCED ROW AFTER 3 DAYS OF NO MODIFICATION;
   ```
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
   不支持系统表、全局临时表、本地临时表和序列表，不支持Ustore段页式表，不支持unlogged表，不支持IMCV表，不支持压缩toast数据。
   
   
4. 配置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);
   ```
   执行结果示例如下：
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002620725447.png "点击放大")
   
   

5. 等待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());
   ```
   执行结果示例如下：
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002590365866.png "点击放大")
   
   

6. 查询调度任务的压缩结果。 
   ```
   template1=# \c adb
   adb=# SELECT * FROM gs_adm_ilmresults ORDER BY task_id DESC;
   ```
   执行结果示例如下：
   调度任务一分钟执行一次，所以每隔一分钟才会生成一个新的压缩job。SpaceSaving为压缩收益大小，值越大表示压缩收益越大。
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002620645573.png "点击放大")
   如果想让表尽快地压缩完成，可以将每个压缩job每次压缩的数据量大小设置得更大一些，比如1024MB，然后重新启动调度任务，并隔一分钟再次查看压缩结果。
   ```
   adb=# \c adb
   adb=# CALL DBE_ILM_ADMIN.CUSTOMIZE_ILM(13, 1024);
   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=# SELECT * FROM gs_adm_ilmresults ORDER BY task_id DESC;
   ```
   执行结果示例如下：
   ![](https://support.huaweicloud.com/bestpractice-gaussdb/figure/zh-cn_image_0000002620725445.png "点击放大")
   
   
7. 测试完成后，建议恢复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;
   /
   ```
   
   
 
