更新时间: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 父主题: DML/DQL