更新时间: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

相关文档