PostgreSQL 基于行号(tid)的快速扫描

本文介绍 PostgreSQL 中如何利用 TID (行号) 进行快速的数据检索。通过设置 ctid 参数,可以指定特定的数据块及其中的记录,从而实现高效的行级扫描。需要注意的是,此功能依赖于 enable_tidscan 参数的开启。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL 自带的表是堆表,数据按行存储在HEAP PAGE中,在btree索引中,除了存储字段的value,还会存储对应的ctid(即行号),检索记录也是通过行号进行检索的呢。


因此通过行号是可以快速检索到记录的。
行号的写法是(page_number, item_number),数据块从0开始编号,行号从1开始编号。


例子 :
查找0号数据块的第10条记录,走tid扫描,是非常快的,因为已经给出了page号和item号,直接定位block和item。

postgres=#  select * from t_bit2 where ctid='(0,10)'::tid;
                                     id                        
---------------------------------------------------------------------
 101010101010101010101010101010101010101010
(1 row)

postgres=# explain select * from t_bit2 where ctid='(0,10)'::tid;
                      QUERY PLAN                       
-------------------------------------------------------
 Tid Scan on t_bit2  (cost=0.00..1.01 rows=1 width=30)
   TID Cond: (ctid = '(0,10)'::tid)
(2 rows)



要使用tid进行快速的行扫描,必须开启参数enable_tidscan。否则就会走全表扫描的哦,那是非常慢的。

postgres=# set enable_tidscan=off;
SET
postgres=# explain select * from t_bit2 where ctid='(0,10)'::tid;
                         QUERY PLAN                          
-------------------------------------------------------------
 Seq Scan on t_bit2  (cost=0.00..3587783.60 rows=1 width=30)
   Filter: (ctid = '(0,10)'::tid)
(2 rows)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值