
# 操作步骤
1. 创建IMCV。 
   通过ALTER ... COLVIEW命令对已有行存表开启IMCV。默认异步加载模式下，命令返回后等待后台线程加载该表的IMCV。
   ```
   htapdb=# ALTER TABLE lineitem COLVIEW;
   ALTER TABLE
   ```
   可进一步通过gs_global_imcv_info()系统函数确认该表IMCV的加载情况及内存占用等信息。
   其中，rowgroup_num为预期的行组数，populated_rowgroup_num为实际加载的行组数。
   如果该表存在数据，但rowgroup_num值为0，表示该表的IMCV中行组未初始化。
   如果populated_rowgroup_num值等于rowgroup_num值，则表示该表IMCV加载完成。
   ```
   htapdb=# SELECT rel_name, partition_name, subpartition_name, rowgroup_num, populated_rowgroup_num, cu_num_in_mem, cu_mem_size, cu_num_in_disk, cu_disk_size FROM gs_global_imcv_info();
    rel_name | partition_name | subpartition_name | rowgroup_num | populated_rowgroup_num | cu_num_in_mem | 
   cu_mem_size | cu_num_in_disk | cu_disk_size 
   ----------+----------------+-------------------+--------------+------------------------+---------------+-
   ------------+----------------+--------------
    lineitem |                |                   |          605 |                    605 |         10285 | 
    6747449732 |              0 |            0
    lineitem |                |                   |          605 |                    605 |         10285 | 
    6742038164 |              0 |            0
   (2 rows)
   ```
   
   
2. 列存扫描加速。 
   在目标表完成IMCV创建后，该表上的查询即可利用列存进行加速。
   首先需要确认列存扫描开关及HTAP路由模式参数配置正确。推荐将htap_router_mode设置为auto，由优化器根据代价模型自动选择行存或列存扫描路径：
   ```
   htapdb=# SHOW enable_imcvscan;
    enable_imcvscan 
   -----------------
    on
   (1 row)
   htapdb=# SHOW htap_router_mode;
    htap_router_mode 
   ------------------
    auto
   (1 row)
   ```
   可通过EXPLAIN查看执行计划（示例为STREAM执行计划）：
   ```
   htapdb=# EXPLAIN SELECT * FROM lineitem;
    id |                   operation                   |  E-rows  | E-width |  E-costs
   ----+-----------------------------------------------+----------+---------+-----------
     1 | ->  Streaming (type: GATHER)                  | 12288000 |      37 | 766097.99
     2 |    ->  Streaming(type: LOCAL GATHER dop: 1/4) | 12288000 |      37 | 56244.11
     3 |       ->  Row Adapter                         | 12288000 |      37 | 14564.46
     4 |          ->  Imcv Scan on lineitem            | 12288000 |      37 | 14564.46
   (4 rows)
   ```
   若由于代价估计不准确等原因，在列存扫描具有实际收益的场景下，优化器未选择列存扫描路径，可通过以下方式进行干预：
   - 设置htap_router_mode='column'，强制优先选择列存扫描路径。
   
   - 或为查询添加IMCVScan Hint。
   
   
   ```
   htapdb=# EXPLAIN SELECT /*+ imcvscan(lineitem)*/ * FROM lineitem;
    id |                   operation                   |  E-rows  | E-width |  E-costs
   ----+-----------------------------------------------+----------+---------+-----------
     1 | ->  Streaming (type: GATHER)                  | 12288000 |      37 | 766097.99
     2 |    ->  Streaming(type: LOCAL GATHER dop: 1/4) | 12288000 |      37 | 56244.11
     3 |       ->  Row Adapter                         | 12288000 |      37 | 14564.46
     4 |          ->  Imcv Scan on lineitem            | 12288000 |      37 | 14564.46
   (4 rows)
   ```
   
   
3. 卸载IMCV（可选）。 
   当不再需要该表的IMCV并释放对应的内存空间时，可通过ALTER ... NOCOLVIEW命令完成卸载。
   ```
   htapdb=# ALTER TABLE lineitem NOCOLVIEW;
   ALTER TABLE
   ```
   
   
 
