操作步骤
- 创建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)
- 列存扫描加速。
在目标表完成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)
- 卸载IMCV(可选)。
当不再需要该表的IMCV并释放对应的内存空间时,可通过ALTER ... NOCOLVIEW命令完成卸载。
htapdb=# ALTER TABLE lineitem NOCOLVIEW; ALTER TABLE