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)