暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

149


作者时间QQ技术交流群
perrynzhou@gmail.com2022/10/01672152841



计算机
内数据访问的时间






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


PG
磁盘数据到内存概览




  • 任何传统传统数据库都会借助DRAM
    来加速数据库磁盘数据的访问。比如PG
    中的share_buffer
    ,全局为PG
    数据库中表存储的数据page
    提供缓冲空间。当用户执行查询语句的时候,首先去查询share_buffer
    中这个数据page
    是否在缓存区中,如果在就返回page
    ;如果不在则去磁盘读取这个数据的page
    share_buffer
    最后返回。

  • 这里涉及到两个基本的结构,一个是share_buffer
    ,另外一个是page
    .下面核心会聚焦到这2个点上,了解PG
    是如何实现这些逻辑


PG
中的数据对象

  • PG
    中一般会有三种对象,分别是数据库

    索引
    .三者之间的关系如下



  • PG
    中一个表一般会有三种类型的数据,一个是fsm
    文件表示当前数据表中可用的空闲空间,另外一个是vm
    文件来表示数据表中数据可见性的映射,最后一个是以oid
    来表示的数据文件.fsm
    是基于page来管理空闲空间,其采用binary-tree
    的方式进行管理。vm
    中的可见性也是基于page
    来管理。






// 创建测试表
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 Header
    Tuple Data
    .


  • Page
    PG
    使用了PageHeaderData
    来表示每个Page
    的头。这里存储了每个Page
    的meta信息,PageHeaderData->pd_linp
    是一个数组质指向Page
    内的Tuple

文章转载自存储内核技术交流,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论