更新时间:2026-07-28 GMT+08:00
列回行混合扫描
列回行混合扫描,是一种特殊的列存扫描方式。当查询所访问的列并非全部创建了列存,而且查询谓词涉及的所有列均创建IMCV,基于代价可生成列回行混合扫描计划。
该特性可在内存有限、仅部分列创建IMCV的情况下,利用创建IMCV的列加速查询。
示例:
-- 只有部分列存在列存数据的情况下,查询可以走列回行混合扫描。
gaussdb=# DROP TABLE IF EXISTS test_table;
CREATNOTICE: table "test_table" does not exist, skipping
DROP TABLE
gaussdb=# 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));
CREATE TABLE
gaussdb=# INSERT INTO test_table VALUES (200, 100, -1, 'CNY', 'ee', 'CNY');
INSERT 0 1
gaussdb=# INSERT INTO test_table VALUES (300, 200, -1, 'EUR', 'de', 'EUR');
INSERT 0 1
gaussdb=# INSERT INTO test_table VALUES (200, 300, -1, 'US', 'de', 'US');
INSERT 0 1
gaussdb=# SET enable_imcvscan=on;
SET
gaussdb=# SET htap_router_mode='auto';
SET
gaussdb=# ALTER TABLE test_table COLVIEW(supplier_id, supplier_txn_code);
ALTER TABLE
gaussdb=# SELECT relname, dbname, imcvkey FROM gs_imcv WHERE relname = 'test_table';
relname | dbname | imcvkey
------------+----------+---------
test_table | postgres | 2 4
(1 row)
gaussdb=# SET enable_hybrid_imcvscan=off;
SET
gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM test_table t WHERE t.supplier_id >= 200;
QUERY PLAN
----------------------------------------------------------------
Seq Scan on test_table t
Filter: (supplier_id >= 200), (Expression Flatten Optimized)
(3 rows)
gaussdb=# SELECT * FROM test_table t WHERE t.supplier_id >= 200;
supplier_txn_base_id | supplier_id | supplier_address_id | supplier_txn_code | shipment_code | invoice_currency_code
----------------------+-------------+---------------------+-------------------+---------------+-----------------------
300 | 200 | -1 | EUR | de | EUR
200 | 300 | -1 | US | de | US
(2 rows)
gaussdb=# SET enable_hybrid_imcvscan=on;
SET
gaussdb=# EXPLAIN (COSTS OFF) SELECT * FROM test_table t WHERE t.supplier_id >= 200;
QUERY PLAN
---------------------------------------------
Row Adapter
-> Imcv Scan on test_table t
Filter: (supplier_id >= 200)
(4 rows)
gaussdb=# SELECT * FROM test_table t WHERE t.supplier_id >= 200;
supplier_txn_base_id | supplier_id | supplier_address_id | supplier_txn_code | shipment_code | invoice_currency_code
----------------------+-------------+---------------------+-------------------+---------------+-----------------------
300 | 200 | -1 | EUR | de | EUR
200 | 300 | -1 | US | de | US
(2 rows)
gaussdb=# DROP TABLE test_table;
DROP TABLE 父主题: DML/DQL