更新时间:2026-07-28 GMT+08:00
分享

列回行混合扫描

列回行混合扫描,是一种特殊的列存扫描方式。当查询所访问的列并非全部创建了列存,而且查询谓词涉及的所有列均创建IMCV,基于代价可生成列回行混合扫描计划。

该特性可在内存有限、仅部分列创建IMCV的情况下,利用创建IMCV的列加速查询。

示例:

-- 只有部分列存在列存数据的情况下,查询可以走列回行混合扫描。
htapdb=# DROP TABLE IF EXISTS test_table;
CREATNOTICE:  table "test_table" does not exist, skipping
DROP TABLE

htapdb=# CREATE TABLE test_table (
    supplier_txn_base_id bigint NOT NULL,
    supplier_id bigint NOT NULL,
    supplier_address_id bigint,
    supplier_txn_code nvarchar2(30) NOT NULL,
    shipment_code nvarchar2(30),
    invoice_currency_code nvarchar2(15)) DISTRIBUTE BY HASH(supplier_txn_base_id);
CREATE TABLE

htapdb=# INSERT INTO test_table VALUES (200, 100, -1, 'CNY', 'ee', 'CNY');
INSERT 0 1

htapdb=# INSERT INTO test_table VALUES (300, 200, -1, 'EUR', 'de', 'EUR');
INSERT 0 1

htapdb=# INSERT INTO test_table VALUES (200, 300, -1, 'US', 'de', 'US');
INSERT 0 1

htapdb=# SET enable_imcvscan=on;
SET

htapdb=# SET htap_router_mode='column';
SET

-- 部分列创建IMCV。
htapdb=# ALTER TABLE test_table COLVIEW(supplier_id, supplier_txn_code);
ALTER TABLE

htapdb=# SELECT node_name, rel_name, partition_name, imcvnattr, imcvkey, rowgroup_num, cu_num_in_mem, cu_mem_size, cu_num_in_disk, cu_disk_size FROM gs_global_imcv_info() ORDER BY node_name,rel_name;
  node_name   |  rel_name  | partition_name | imcvnattr |  imcvkey  | rowgroup_num | cu_num_in_mem | cu_mem_size | cu_num_in_disk | cu_disk_size 
--------------+------------+----------------+-----------+-----------+--------------+---------------+-------------+----------------+--------------
 dn_6001_6002 | test_table |                |         2 | 2 4       |            1 |             3 |       12112 |              0 |            0
 dn_6003_6004 | test_table |                |         2 | 2 4       |            0 |             0 |           0 |              0 |            0
(4 rows)

-- 关闭列回行混合扫描。
htapdb=# SET enable_hybrid_imcvscan=off;
SET

htapdb=# EXPLAIN (COSTS OFF) SELECT * FROM test_table t WHERE t.supplier_id >= 200;
              QUERY PLAN              
--------------------------------------
 Streaming (type: GATHER)
   Node/s: All datanodes
   ->  Seq Scan on test_table t
         Filter: (supplier_id >= 200)
(4 rows)
-- 开启列回行混合扫描。
htapdb=# SET enable_hybrid_imcvscan=on;
SET
-- 查询访问到未创建IMCV的列、谓词列创建了IMCV,仍支持列存扫描。
htapdb=# EXPLAIN (COSTS OFF) SELECT * FROM test_table t WHERE t.supplier_id >= 200;
                 QUERY PLAN                 
--------------------------------------------
 Row Adapter
   ->  Vector Streaming (type: GATHER)
         Node/s: All datanodes
         ->  Imcv Scan on test_table t
               Filter: (supplier_id >= 200)
(5 rows)

htapdb=# DROP TABLE test_table;
DROP TABLE

相关文档