更新时间:2025-03-13 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=# EXPLAIN ANALYZE SELECT * FROM t_tid_test WHERE ctid = '(0,10)'::tid; QUERY PLAN -------------------------------------------------------------------------------------------------------------------- Streaming (type: GATHER) (cost=0.07..4.11 rows=1 width=14) (actual time=3.089..3.282 rows=2 loops=1) Node/s: All datanodes -> Tid Scan on t_tid_test (cost=0.00..4.01 rows=1 width=14) (actual time=[0.051,0.052]..[0.055,0.056], rows=2) TID Cond: (ctid = '(0,10)'::tid) Total runtime: 3.473 ms (5 rows) --删除表。 gaussdb=# DROP TABLE t_tid_test;
上述示例中,Tid Scan算子输出信息如下所示。
信息名称 |
含义 |
---|---|
Tid Scan |
算子的名称。 |
TID Cond |
该算子的过滤谓词,在查询执行时,满足这些条件的行会被包含在最终的结果集中。 |
父主题: 表访问方式