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

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)

你可能感兴趣的:(PostgreSQL 基于行号(tid)的快速扫描)