更新时间:2025-05-29 GMT+08:00

Tid Scan

算子说明

行号扫描,该算子主要利用行号(ctid)过滤元组并返回。ASTORE场景下,数据按行存储在HEAP PAGE中,在B-tree 索引中除了存储字段的value,还会存储对应的行号,因此GaussDB中支持通过行号进行快速检索。

行号的写法为:

(page_number,item_number)      -- page_number从0开始编号,item_number从1开始编号

通过给定的ctid值找到在磁盘或缓存中对应的元组。

典型场景

前提条件:GUC参数enable_tidscan设置为on。

对于支持Tid Scan的表,给定合法有效的行号,可对数据进行快速检索。当前GaussDB会选择Tid Scan的场景只有WHERE条件为"="的查询,不支持in的条件查询。

示例

--数据准备。
gaussdb=# CREATE TABLE t_tid_test(a numeric,b numeric,c numeric);
CREATE TABLE 
gaussdb=# DECLARE 
    n1 numeric := 10; 
    n2 numeric := 0; 
    n3 numeric := 100; 
BEGIN 
    WHILE n1 > 0 LOOP 
        WHILE n2 < 100 LOOP 
            WHILE n3 > 0 LOOP 
                INSERT INTO t_tid_test VALUES(n1, n2, n3); 
                n3 := n3 - 1; 
            END LOOP; 
            n2 := n2 + 1; 
        END LOOP; 
        n1 := n1 - 1; 
    END LOOP; 
END; 
/
ANONYMOUS BLOCK EXECUTE

--收集统计信息。
gaussdb=# ANALYZE t_tid_test;

--执行结果。
gaussdb=# SET enable_tidscan = on; 
SET
gaussdb=# SET max_datanode_for_plan = 2;
SET
gaussdb=# EXPLAIN SELECT * FROM t_tid_test WHERE ctid = '(0,10)'::tid;
                                  QUERY PLAN
------------------------------------------------------------------------------
 Data Node Scan  (cost=0.00..0.00 rows=0 width=0)
   Node/s: All datanodes

 Remote SQL: SELECT a, b, c FROM public.t_tid_test WHERE ctid = '(0,10)'::tid
 Datanode Name: datanode1
   Seq Scan on t_tid_test  (cost=0.00..2.25 rows=1 width=13)
     Filter: (ctid = '(0,10)'::tid)

 Datanode Name: datanode2
   Tid Scan on t_tid_test  (cost=0.00..4.01 rows=1 width=96)
     TID Cond: (ctid = '(0,10)'::tid)

(12 rows)

--删除表。
gaussdb=# DROP TABLE t_tid_test;

上述示例中,Tid Scan算子输出信息如下所示。

信息名称

含义

Tid Scan

算子的名称。

TID Cond

该算子的过滤谓词,在查询执行时,满足这些条件的行会被包含在最终的结果集中。