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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: PostgreSQL 自带的表是堆表,数据按行存储在HEAP PAGE中,在btree索引中,除了存储字段的value,还会存储对应的ctid(即行号),检索记录也是通过行号进行检索的呢。 因此通过行号是可以快速检索到记录的。行号的写法是(page_number, item_number),数据块

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)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
存储 关系型数据库 PostgreSQL
PostgreSQL TID及tuple slot
PostgreSQL TID及tuple slot
224 0
PostgreSQL TID及tuple slot
|
存储 关系型数据库 PostgreSQL
PostgreSQL表扫描方法解析
PostgreSQL表扫描方法解析
128 0
|
存储 SQL Oracle
PostgreSQL扫描方法综述
PostgreSQL扫描方法综述
129 0
|
SQL 存储 Oracle
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
3848 0
|
SQL 存储 弹性计算
PostgreSQL 分页, offset, 返回顺序, 扫描方法原理(seqscan, index scan, index only scan, bitmap scan, parallel xx scan),游标
标签 PostgreSQL , 数据离散性 , 扫描性能 , 重复扫 , bitmap index scan , 排序扫描 , 扫描方法 , 顺序 背景 一个这样的问题: 为什么select x from tbl offset x limit x; 两次查询连续的OFFSET,会有重复数据呢? select ctid,* from tbl where ... offset 0 li
2114 0
|
存储 关系型数据库 PostgreSQL
PostgreSQL优化器之从一个关于扫描方式选择引发的思考
# 一个关于PostgreSQL使用组合索引的问题 近期阅读了《数据库查询优化器的艺术》这本书,对PG和Mysql优化器技术的轮廓有了一定了解。在阅读的过程中,因为知识背景和书本身的表述问题产生了许多困惑,这里就分享对其中一个困惑的探索过程作为看完书的总结。 在这本书的第十八章,关于PG和Mysql的优化器对于索引的优化能力对比中的一段让我困惑不已。如图一所示,单独使用组合索引的后半部分作为查
4726 0
|
SQL 存储 关系型数据库
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 11 章 索引_11.11. 只用索引的扫描
11.11. 只用索引的扫描 PostgreSQL中的所有索引都是二级索引,表示每一个索引都被存储在表的主数据区域(在PostgreSQL术语中被称为该表的堆)之外。这意味着在一次普通索引扫描中,每次取一行需要从索引和堆中取得数据。
1083 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版