操作步骤
- 创建IMCV。
可通过ALTER TABLE ... COLVIEW命令为已有行存表创建IMCV。默认采用异步加载模式,命令返回后,由后台线程负责IMCV的加载。
gaussdb=# ALTER TABLE lineitem COLVIEW; ALTER TABLE
命令执行成功后,可通过系统函数gs_htap_imcv_info()查询IMCV的加载状态及内存使用情况。其中,rowgroup_num表示预期生成的行组数量,populated_rowgroup_num表示已完成加载的行组数量。
若表中存在数据但rowgroup_num=0,表示IMCV的行组尚未初始化;当populated_rowgroup_num=rowgroup_num时,表示IMCV已全部加载完成。
gaussdb=# SELECT rowgroup_num, populated_rowgroup_num, cu_num_in_mem, cu_mem_size, cu_num_in_disk, cu_disk_size FROM gs_htap_imcv_info(); rowgroup_num | populated_rowgroup_num | cu_num_in_mem | cu_mem_size | cu_num_in_disk | cu_disk_size --------------+------------------------+---------------+--------------+----------------+-------------- 12091 | 12091 | 205547 | 120532019284 | 0 | 0 (1 row) - 列存扫描加速。
在目标表完成IMCV创建后,该表上的查询即可利用列存扫描进行加速。
首先需要确认列存扫描开关及HTAP路由模式参数配置正确。推荐将htap_router_mode设置为auto,由优化器根据代价模型自动选择行存或列存扫描路径:
gaussdb=# SHOW enable_imcvscan; enable_imcvscan ----------------- on (1 row) gaussdb=# SHOW htap_router_mode; htap_router_mode ------------------ auto (1 row)
可通过EXPLAIN查看执行计划,确认查询是否采用列存扫描(IMCV Scan)路径:
gaussdb=# EXPLAIN SELECT * FROM lineitem; QUERY PLAN -------------------------------------------------------------------------------- Row Adapter (cost=12690329.91..12690329.91 rows=600055911 width=129) -> Imcv Scan on lineitem (cost=0.00..12690329.91 rows=600055911 width=129) (2 rows)若由于代价估计不准确等原因,在列存扫描具有实际收益的场景下,优化器未选择列存扫描路径,可通过以下方式进行干预:
- 设置htap_router_mode='column',强制优先选择列存扫描路径。
- 或为查询添加IMCVScan Hint。
gaussdb=# EXPLAIN SELECT /*+ imcvscan(lineitem)*/ * FROM lineitem; QUERY PLAN -------------------------------------------------------------------------------- Row Adapter (cost=12690329.91..12690329.91 rows=600055911 width=129) -> Imcv Scan on lineitem (cost=0.00..12690329.91 rows=600055911 width=129) (2 rows) - 卸载IMCV(可选)。
当不再需要该表的IMCV并释放对应的内存空间时,可通过ALTER ... NOCOLVIEW命令完成卸载。
gaussdb=# ALTER TABLE lineitem NOCOLVIEW; ALTER TABLE