前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >探索PostgreSQL数据存储存储之数据页

探索PostgreSQL数据存储存储之数据页

作者头像
用户4700054
发布2023-02-26 14:41:58
3.7K0
发布2023-02-26 14:41:58
举报

计算机内数据访问的时间

  • CPU L1->CPU L2->DRAM->SSD->HDD->Network Storage->Tape Archives不同层次的访问,访问的时间差距很大。上图的左边是每个层次的硬件访问数据的时间周期,上图的右边是不同硬件访问时间的放大,越上层访问越短,越下层访问时间越长;但是从容量上看越上层的容量越小,越下层的容量越大。

PG磁盘数据到内存概览

  • 任何传统传统数据库都会借助DRAM来加速数据库磁盘数据的访问。比如PG中的share_buffer,全局为PG数据库中表存储的数据page提供缓冲空间。当用户执行查询语句的时候,首先会去查询share_buffer中这个数据page是否在缓存区中,如果在就返回page;如果不在则去磁盘读取这个数据的pageshare_buffer最后返回。
  • 这里涉及到两个基本的结构,一个是share_buffer,另外一个是page.下面核心会聚焦到这2个点上,了解PG是如何实现这些逻辑

PG中的数据对象

  • PG中一般会有三种对象,分别是数据库索引.三者之间的关系如下
  • PG中一个表一般会有三种类型的数据,一个是fsm文件表示当前数据表中可用的空闲空间,另外一个是vm文件来表示数据表中数据可见性的映射,最后一个是以oid来表示的数据文件.fsm是基于page来管理空闲空间,其采用binary-tree的方式进行管理。vm中的可见性也是基于page来管理。
代码语言:javascript
复制
// 创建测试表
perryn_demo=> create table email(id int,name varchar(255));
CREATE TABLE
// 查询的表的OID
perryn_demo=> select oid,relfilenode from pg_class where relname='email';
  oid  | relfilenode 
-------+-------------
 16386 |       16386
(1 row)

// 插入数据
perryn_demo=> insert into email SELECT generate_series(1,200000),repeat(chr(int4(random()*26)+65),200);
INSERT 0 190001

PG中的Page

  • PG中的Page中都有一个PageHeader,其次是多个数据指针。数据的Page是从尾部Special开始写。每个Tuple也包含了Tuple HeaderTuple Data.
  • PagePG使用了PageHeaderData来表示每个Page的头。这里存储了每个Page的meta信息,PageHeaderData->pd_linp是一个数组质指向Page内的Tuple
代码语言:javascript
复制
typedef struct PageHeaderData
{
	// 上一次做更改的xlog的lsn号
	PageXLogRecPtr pd_lsn;		
	// 如果设置了page checksum这里就存储了checksun
	uint16		pd_checksum;	
	// flag的设置
	uint16		pd_flags;		
	// 执行free space的偏移量
	LocationIndex pd_lower;		
	// 执行free space的结束位置的偏移量
	LocationIndex pd_upper;		
	// 执行special space的偏移量
	LocationIndex pd_special;	
	// page的版本号
	uint16		pd_pagesize_version;
	// 最旧的xid
	TransactionId pd_prune_xid; 
	// page header的指针数组
	ItemIdData	pd_linp[FLEXIBLE_ARRAY_MEMBER]; 
} PageHeaderData;

typedef PageHeaderData *PageHeader;


typedef struct ItemIdData
{
	// 物理page的偏移量
	unsigned	lp_off:15,		
	// line poiner的状态
				lp_flags:2,		
	// tuple的长度
				lp_len:15;		
} ItemIdData;

typedef ItemIdData *ItemId;
  • 每个Tuple都有一个HeapTupleHeaderData作为Tuple的header.HeapTupleHeaderData并没有存储任何的行的属性信息,属性信息存储在TupleDescData
代码语言:javascript
复制
// 包含在tuple header中的信息
typedef struct HeapTupleFields
{
	// 插入事务ID
	TransactionId t_xmin;		
	// 删除事务ID
	TransactionId t_xmax;		

	union
	{
		// 插入或者删除的cmd id
		CommandId	t_cid;		
		TransactionId t_xvac;	/* old-style VACUUM FULL xact ID */
	}			t_field3;
} HeapTupleFields;

// 记录tuple的在位置信息
typedef struct ItemPointerData
{
	
	BlockIdData ip_blkid;
	OffsetNumber ip_posid;
}

typedef struct HeapTupleHeaderData HeapTupleHeaderData;


struct HeapTupleHeaderData
{
	// 每个元组的事务信息/记录的多少列信息
	union
	{
		// tuple事务信息存储在t_heap中
		HeapTupleFields t_heap;
		DatumTupleFields t_datum;
	}			t_choice;

	// 这个tuple的行记录所在的位置信息
	ItemPointerData t_ctid;		/* current TID of this or newer tuple (or a
								 * speculative insertion token) */


// t_infomask2和t_infomask 决定
#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK2 2
	uint16		t_infomask2;	

#define FIELDNO_HEAPTUPLEHEADERDATA_INFOMASK 3
	uint16		t_infomask;		
// t_hoff 表示行数据所在的位置
#define FIELDNO_HEAPTUPLEHEADERDATA_HOFF 4
	uint8		t_hoff;			

	/* ^ - 23 bytes - ^ */

#define FIELDNO_HEAPTUPLEHEADERDATA_BITS 5
	bits8		t_bits[FLEXIBLE_ARRAY_MEMBER];	/* bitmap of NULLs */

	/* MORE DATA FOLLOWS AT END OF STRUCT */
};
  • Tuple的属性信息存储在TupleDescData.
代码语言:javascript
复制
typedef struct TupleDescData
{
	int			natts;			/* number of attributes in the tuple */
	Oid			tdtypeid;		/* composite type ID for tuple type */
	int32		tdtypmod;		/* typmod for tuple type */
	int			tdrefcount;		/* reference count, or -1 if not counting */
	TupleConstr *constr;		/* constraints, or NULL if none */
	/* attrs[N] is the description of Attribute Number N+1 */
	FormData_pg_attribute attrs[FLEXIBLE_ARRAY_MEMBER];
}			TupleDescData;
typedef struct TupleDescData *TupleDesc;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 存储内核技术交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 计算机内数据访问的时间
  • PG磁盘数据到内存概览
  • PG中的数据对象
  • PG中的Page
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档